Jak mogę rekurencyjnie usunąć wszystkie pliki określonego rozszerzenia w bieżącym katalogu?

531

Jak bezpiecznie usunąć wszystkie pliki z określonym rozszerzeniem (np. .bak) Z bieżącego katalogu i wszystkich podfolderów za pomocą jednego wiersza polecenia? Po prostu boję się używać, rmponieważ raz źle go użyłem, a teraz potrzebuję porady.

użytkownik216038
źródło

Odpowiedzi:

840

W tym przypadku nie musisz nawet używać, rmjeśli się boisz. Użyj find:

find . -name "*.bak" -type f -delete

Ale używaj go ostrożnie. Być pierwszym na mecie:

find . -name "*.bak" -type f

aby zobaczyć dokładnie, które pliki zostaną usunięte.

Upewnij się-delete również, że to ostatni argument w twoim poleceniu. Jeśli umieścisz go przed -name *.bak argument, usunie wszystko .

Zobacz man findi man rmwięcej informacji, a także podobne pytanie dotyczące SE:

Radu Rădeanu
źródło
Czym to się różni rm *.bak?
sayantankhan
10
@ Bolt64 Twoje rm *.baknie będzie działać w podkatalogach.
Radu Rădeanu
Przy ustawieniach domyślnych rm *.bakusuwa tylko wszystkie pliki z rozszerzeniem .bak w bieżącym katalogu. Aby również robić rzeczy w podkatalogach, które musiałyście majstrować przy globach, użyj opcji -r lub skorzystaj z przykładu find.
Hennes
9
@Hennes Bądź ostrożny rm -r *.bak! Usuwa również katalogi kończące .baksię całą zawartością.
Radu Rădeanu
37
Upewnij się, że -deleteto ostatni argument w twoim poleceniu. Jeśli umieścisz go przed -name *.bakargumentem, usunie wszystko.
Michael
40
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
lokers
źródło
1
Witamy w askubuntu! Chociaż jest to całkowicie poprawna odpowiedź, nie sądzę, aby korzystanie z tego zamiast -deleteflagi find. Więcej informacji można znaleźć we wpisie instrukcji GNU do usuwania plików z find .
Glutanimate
2
prawdopodobnie masz rację, to tylko alternatywne rozwiązanie, być może bardziej surowe;)
lokers
11
To nie jest tylko alternatywa, ale przykład, w jaki sposób można połączyć inne polecenia razem z potokiem „|”. +1
Boris Pavlović
13
Te alternatywne rozwiązania działają w innych środowiskach, w których brakuje opcji -delete (jak cygwin)
ciriarte
2
Myślę, że to najlepsza odpowiedź tutaj.
Léo Léopold Hertz
33

Najpierw uruchom polecenie shopt -s globstar. Możesz uruchomić to w wierszu poleceń, a zadziała to tylko w tym oknie powłoki. Możesz umieścić go w swoim .bashrc, a wtedy wszystkie nowo uruchomione pociski go podniosą. Efektem tego polecenia jest **/rekurencyjne tworzenie plików dopasowania w bieżącym katalogu i jego podkatalogach (domyślnie **/oznacza to samo, co */: tylko w bezpośrednich podkatalogach). Następnie:

rm **/*.bak

(lub gvfs-trash **/*.bakco masz).

Gilles
źródło
21

Usuwanie plików nie jest dla mnie czymś, czego powinieneś używać rm. Oto alternatywa:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Jak stwierdza Flimm w komentarzach:

Pakiet trash-clirobi to samo, co gvfs-trashbez zależności od gvfs.

Więc:

sudo apt-get install trash-cli

Nie musisz do tego tworzyć aliasu, ponieważ trash-clipakiet zawiera polecenie trash, które robi to, co chcemy.

Jak Eliah Kagan wyjaśnia w obszernych komentarzach, możesz również użyć tego rekurencyjnego find. W takim przypadku nie możesz użyć aliasu, więc poniższe polecenia zakładają, że masz zainstalowany trash-cli. Podsumowuję komentarze Eliasza:

To polecenie wyszukuje i wyświetla wszystkie .bakpliki i dowiązania symboliczne w dowolnym miejscu bieżącego katalogu lub jego podkatalogów lub niższych.

find . -name '*.bak' -xtype f

Aby je usunąć, dodaj polecenie -execz trashpoleceniem:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype fwybiera pliki i dowiązania symboliczne do plików, ale nie foldery. Aby usunąć również foldery .bak, usuń tę część i użyj -execdir, aby uniknąć cannot trash non-existentbłędów .bakplików w .bakkatalogach:

find . -name '*.bak' -execdir trash {} +
don.joey
źródło
4
„Nie używaj rmdo usuwania rzeczy” jest kontrowersyjnym stwierdzeniem, ale muszę się zgodzić, że często rozsądniej jest użyć czegoś, co pozwoli ci cofnąć pewne rzeczy.
Oli
2
Pakiet trash-clirobi to samo, co gvfs-trashbez zależności gvfs.
Flimm,
Zredagowałem go w odpowiedzi, następnym razem możesz go edytować samodzielnie.
don.joey
@ don.joey Ta odpowiedź wydaje się wskazywać, find . -name "*.bak" -type fco trash *.bakusuwa. Czy to naprawdę masz na myśli? Możesz przenosić katalogi do kosza za pomocą trashlub gvfs-trash, ale trash *.bakprzenosi tylko pliki i katalogi, których nazwy kończą się na .baki które znajdują się natychmiast w bieżącym katalogu. Powłoka rozszerza się *.bak, więc trash *.baknie wpłynie na .bakpliki w podkatalogach, które same nie są nazwane .bak.
Eliah Kagan
1
@ don.joey Tak ls *.bak(co myślę, że masz na myśli) wymienia, jakie trash *.bakśmieci. find . -name '*.bak' -xtype f -exec trash {} +niszczy wszystkie .bakpliki w dowolnym miejscu pod .. Nie może używać aliasu, więc zamiast tego zainstaluj trash-clilub napisz gvfs-trash. Oto przykład. -xtype fwybiera pliki i dowiązania symboliczne do plików, ale nie foldery. Aby usunąć również .bak foldery , użyj find . -name '*.bak' -execdir trash {} +, co pozwala uniknąć cannot trash non existentbłędów .bakplików w .bakkatalogach. Możesz użyć dowolnego z tych danych w swojej odpowiedzi.
Eliah Kagan
5

Jeśli chcesz usunąć wszystkie pliki określonego typu, ale tylko 1 folder „głęboki” z bieżącego folderu:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2, ponieważ bieżący katalog „ . ” liczy się jako pierwszy folder.

Hipokryt
źródło
1

Szybka odpowiedź:

  • Usuń wszystkie pliki z rozważaną nazwą lub postfiksem rekurencyjnie:

    find . -name '*.pyc' -type f -delete

  • Usuń wszystkie katalogi o rozważanej nazwie rekurencyjnie:

    find ~ -path '*/__pycache__/*' -delete‍‍‍
    find ~ -type d -name '__pycache__' -empty -delete‍‍‍
    

    Nieco mniej ściśle kontrolowane, ale w jednej linii:

    find ~ -path '*/__pycache__*' -delete
    

[ UWAGA ]:

djest opcją katalogu i fopcją pliku.

Benyamin Jafari
źródło
0

Jeśli korzystasz z repozytorium git, możesz użyć:

git clean -fdx

Spowoduje to usunięcie nieśledzonych plików i plików w .gitignore.

Vasantha Ganesh K
źródło