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
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 zls
. (Přesné výsledky mohou záviset na možnostech glob ' s glob.) -
.txt$
bude odpovídat řetězcům končícímtxt
bez ohledu na tečku. Protožegrep
bere regulární výraz jako parametr. Takže souborya.txt
aaatxt
aa-txt
budou 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 <-v
pří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
-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")
rm
vždy otestujte dané odpovědi neškodným příkazem, jako jels
.