Wiem, jak usunąć wszystkie pliki txt z bieżącego katalogu przez rm *.txt. Czy ktoś wie, jak usunąć wszystkie pliki w bieżącym katalogu Z WYJĄTKIEM txt pliku?
Komentarze
Odpowiedz
Możesz użyć find:
find . -type f ! -name "*.txt" -delete
Lub rozszerzonych funkcji globalnego basha:
shopt -s extglob rm *.!(txt)
Lub w zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Komentarze
- Niektóre z nich mogą wymagać dostosowania w zależności od tego, czy masz foldery i co chcesz z nimi zrobić.
- Nie powinno ' t
*.!(txt)be!(*.txt)? - @LauriRanta zależy od tego, co ' s w folderze, którego nie mamy ' nie otrzymałem odpowiedzi. ' jest w porządku, gdyby wszystkie pliki miały rozszerzenia, a
rmdławiłby się, gdyby były foldery. - Mam ' problem z nawiasami. Kiedy używam stylu globbing w skrypcie bash, narzeka on na błąd składni i nawiasy. Jednak zrobienie tego z CLI działa.
- @izogfif sprawdź, czy to
find . -type f ! -name "*.txt" | xargs -r rmzadziała w GNU \ xargs. Polecenie xargs w BSD i UNIX może nie mieć opcji -r, musisz sprawdzić lokalnąman xargs
Odpowiedź
Jeśli chcesz tylko usunąć wszystkie pliki z wyjątkiem „* .txt”, możesz użyj następującego polecenia:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
ale jeśli chcesz również usunąć katalogi wraz z plikami, możesz użyć tego:
$ find . ! -name "*.txt" -exec rm -r {} \;
Odpowiedź
Można to zrobić na wiele sposobów. ale najprostszym sposobem byłoby (bash):
shopt -s extglob rm !(*.txt)
Komentarze
- Jak mogę używać ma to na celu określenie wielu rozszerzeń?
-
shopt -s extglobjest potężny. tecmint.com/… zawiera dobre przykłady. Aby usunąć wszystkie z wyjątkiem niektórych rozszerzeń,rm -v !(*.zip|*.odt)działa.
Odpowiedź
Możesz użyć odwróconych grep i xargs
ls | grep -v .txt$| xargs rm
Komentarze
-
ls | grep -v *.txt | xargs rmdziała równie dobrze - @phillipsk
grep -v *.txtbędzie działać tylko wtedy, gdy ' to dokładnie jeden.txtplik. Jeśli go nie ma,grepużyje*.txtjako wzorca; jeśli jest więcej niż jedna ', wyszuka pierwszą nazwę pliku we wszystkich pozostałych plikach.txt, ignorując dane wyjściowe zls. (Dokładne wyniki mogą zależeć od opcji globalnej powłoki '). -
.txt$dopasuje ciągi kończące się natxtniezależnie od kropki. Ponieważgrepprzyjmuje wyrażenie regularne jako parametr. Dlatego plikia.txtiaatxtia-txtzostaną dopasowane przez to wyrażenie. Prawidłowe wyrażenie powinno brzmiećls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Dla ciekawskich: jeśli chcesz bezpiecznie bawić się wyrażeniem, użyj tego wyrażenia testowegols | grep \\.txt$ | xargs --no-run-if-empty echo(uwaga: there ' s no-virm=>echo). Uwaga 2: być może zauważyłeś podwójny lewy ukośnik. Jeden służy do wyrażenia regularnego, a drugi do ukośnika bash.
Odpowiedź
Jedno rozwiązanie bez find:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Powinno działać na wszystkich rodzajach powłok.
Odpowiedź
Po prostu zrób:
rm $(ls -I "*.txt" ) # Usuwa typ pliku z wyjątkiem * .txt
Podobnie, jeśli chcesz usunąć „oprócz jednego lub więcej typów plików”, zrób:
rm $(ls -I "*.txt" -I "*.pdf" ) # Usuwa typy plików z wyjątkiem * .txt & * .pdf
Komentarze
- Witamy w StackExchange!Opcja
-Imoże być przydatna, ale zobacz dlaczego nie przeanalizować ls . A co daje| xargs? Bez żadnych argumentów wykonuje po prostuechona wszystkich swoich wejściach. - Co ma osiągnąć
xargs? - Dzięki, xargs nie był przydatny w powyższym przypadku, został już poprawiony.
Odpowiedź
Działa to również w celu usunięcia wszystkich ukrytych (kropek) plików i folderów z wyjątkiem podanego (.mydir):
rm -rf $(ls -aI ".mydir")
ls, zanim faktycznie spróbujesz zadzwonić dorm.