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
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 
rmby 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 rmby 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 extglobje 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 rmfunguje stejně dobře -  @phillipsk 
grep -v *.txtbude fungovat, pouze pokud ' přesně jeden.txtsoubor. Pokud žádný není,greppoužije jako vzor*.txt; pokud je ' více než jeden, bude hledat první název souboru ve všech ostatních.txtsouborech a ignoruje výstup zls. (Přesné výsledky mohou záviset na možnostech glob ' s glob.) -  
.txt$bude odpovídat řetězcům končícímtxtbez ohledu na tečku. Protožegrepbere regulární výraz jako parametr. Takže souborya.txtaaatxtaa-txtbudou tímto výrazem uzavřeny. Správný výraz by měl býtls | 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ýrazls | grep \\.txt$ | xargs --no-run-if-empty echo(poznámka: ' s <-vpříznak arm=>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 
-Imůže být užitečná, ale přečtěte si proč nerozebrat ls . A čeho| xargsdosahuje? Bez jakýchkoli argumentů pouze běžíechona všech svých vstupech. -  Co má 
xargsdosá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") 
rmvždy otestujte dané odpovědi neškodným příkazem, jako jels.