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.