Jak v linuxu odstranit všechny soubory KROMĚ vzoru * .txt?

Vím, jak odstranit všechny soubory txt z aktuálního adresáře rm *.txt. Ví někdo, jak odstranit všechny soubory v aktuálním adresáři KROMĚ txt souboru?

Komentáře

  • Jak před vlastním pokusem o volání rm vždy otestujte dané odpovědi neškodným příkazem, jako je ls.
  • ^ This ten chlap ' nerad žije nebezpečně .. 🙂

odpověď

Můžete použít find:

find . -type f ! -name "*.txt" -delete 

Nebo rozšířené funkce globingu bash:

shopt -s extglob rm *.!(txt) 

Nebo v zsh:

setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything 

Komentáře

  • Některé z nich bude možná nutné upravit podle toho, zda máte složky a co s nimi chcete dělat.
  • Nemělo by se ' t *.!(txt) be !(*.txt)?
  • @LauriRanta záleží na tom, co ' s ve složce, kterou nemáme ' nedostal jsem odpověď. Je ' v pořádku, protože všechny soubory mají přípony, a rm by se dusil, kdyby existovaly složky.
  • Mám ' problém s závorkami. Když používám styl globbingu v bash skriptu, stěžuje si na syntaktickou chybu a závorky. Nicméně dělat to z CLI funguje.
  • @izogfif zaškrtněte toto find . -type f ! -name "*.txt" | xargs -r rm by fungovalo v GNU \ xargs. Příkaz BSD a UNIX xargs nemusí mít -r musíte zkontrolovat místní man xargs

odpověď

Pokud chcete pouze smazat všechny soubory kromě „* .txt“, můžete použijte následující příkaz:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

, ale pokud chcete také odstranit adresáře spolu se soubory pak můžete použít toto:

$ find . ! -name "*.txt" -exec rm -r {} \;

Odpověď

Existuje mnoho způsobů, jak to udělat. ale nejjednodušší způsob by byl (bash):

shopt -s extglob rm !(*.txt) 

Komentáře

  • Jak mohu použít chcete-li zadat více rozšíření?
  • shopt -s extglob je mocný. tecmint.com/… poskytuje dobré příklady. Chcete-li odstranit všechna kromě určitých přípon, rm -v !(*.zip|*.odt) funguje.

Odpovědět

Můžete použít obrácený grep a xargs

ls | grep -v .txt$| xargs rm 

Komentáře

  • ls | grep -v *.txt | xargs rm funguje stejně dobře
  • @phillipsk grep -v *.txt bude fungovat, pouze pokud ' přesně jeden .txt soubor. Pokud žádný není, grep použije jako vzor *.txt; pokud je ' více než jeden, bude hledat první název souboru ve všech ostatních .txt souborech a ignoruje výstup z ls. (Přesné výsledky mohou záviset na možnostech glob ' s glob.)
  • .txt$ bude odpovídat řetězcům končícím txt bez ohledu na tečku. Protože grep bere regulární výraz jako parametr. Takže soubory a.txt a aatxt a a-txt budou tímto výrazem uzavřeny. Správný výraz by měl být ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Pro zvědavé lidi: Chcete-li si s výrazem bezpečně pohrát, použijte tento testovací výraz ls | grep \\.txt$ | xargs --no-run-if-empty echo (poznámka: ' s <-v příznak a rm=>echo). Poznámka 2: Možná jste si všimli dvojitého zpětného lomítka. Jeden je pro regex, jiný pro bash, aby unikl lomítku.

Odpověď

Jedno řešení bez find:

mv dir/*.txt otherdir/ rm -r dir mv otherdir dir 

To by mělo fungovat na všech druzích mušlí.

Odpověď

Jednoduše:

rm $(ls -I "*.txt" ) #Deletes typ souboru kromě * .txt

Podobně, pokud potřebujete smazat „kromě jednoho nebo více typů souborů“, postupujte takto:

rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes typy souborů kromě * .txt & * .pdf

komentářů

  • Vítejte na StackExchange!Možnost -I může být užitečná, ale přečtěte si proč nerozebrat ls . A čeho | xargs dosahuje? Bez jakýchkoli argumentů pouze běží echo na všech svých vstupech.
  • Co má xargs dosáhnout?
  • Díky, xargs nebyl ve výše uvedeném případě užitečný, byly nyní opraveny.

Odpověď

Tímto způsobem lze také odstranit všechny skryté (tečky) soubory a složky kromě uvedeného (.mydir):

rm -rf $(ls -aI ".mydir") 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *