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
rm
dł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 rm
zadział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 extglob
jest 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 rm
działa równie dobrze - @phillipsk
grep -v *.txt
będzie działać tylko wtedy, gdy ' to dokładnie jeden.txt
plik. Jeśli go nie ma,grep
użyje*.txt
jako 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ę natxt
niezależnie od kropki. Ponieważgrep
przyjmuje wyrażenie regularne jako parametr. Dlatego plikia.txt
iaatxt
ia-txt
zostaną 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-v
irm=>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
-I
może być przydatna, ale zobacz dlaczego nie przeanalizować ls . A co daje| xargs
? Bez żadnych argumentów wykonuje po prostuecho
na 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
.