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.
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.
Odpowiedzi:
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:
rm *.baknie będzie działać w podkatalogach.
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.
rm -r *.bak! Usuwa również katalogi kończące .baksię całą zawartością.
-deleteto ostatni argument w twoim poleceniu. Jeśli umieścisz go przed -name *.bakargumentem, usunie wszystko.
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
-deleteflagi find. Więcej informacji można znaleźć we wpisie instrukcji GNU do usuwania plików z find .
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).
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, cogvfs-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 {} +
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.
trash-clirobi to samo, co gvfs-trashbez zależności gvfs.
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.
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.
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.
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.
rm *.bak?