W Linuksie, jak usunąć wszystkie pliki Z WYJĄTKIEM wzorca * .txt?

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

  • Jak zawsze przetestuj podane odpowiedzi nieszkodliwym poleceniem, takim jak ls, zanim faktycznie spróbujesz zadzwonić do rm.
  • ^ To facet nie ' nie lubi żyć niebezpiecznie .. 🙂

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 z ls. (Dokładne wyniki mogą zależeć od opcji globalnej powłoki ').
  • .txt$ dopasuje ciągi kończące się na txt niezależnie od kropki. Ponieważ grep przyjmuje wyrażenie regularne jako parametr. Dlatego pliki a.txt i aatxt i a-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 testowego ls | grep \\.txt$ | xargs --no-run-if-empty echo (uwaga: there ' s no -v i rm=>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 prostu echo 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") 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *