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ć, rm
ponieważ 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ć, rm
ponieważ raz źle go użyłem, a teraz potrzebuję porady.
Odpowiedzi:
W tym przypadku nie musisz nawet używać, rm
jeś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 find
i man rm
więcej informacji, a także podobne pytanie dotyczące SE:
rm *.bak
nie będzie działać w podkatalogach.
rm *.bak
usuwa 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 .bak
się całą zawartością.
-delete
to ostatni argument w twoim poleceniu. Jeśli umieścisz go przed -name *.bak
argumentem, usunie wszystko.
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
-delete
flagi 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 **/*.bak
co 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-cli
robi to samo, cogvfs-trash
bez zależności od gvfs.
Więc:
sudo apt-get install trash-cli
Nie musisz do tego tworzyć aliasu, ponieważ trash-cli
pakiet 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 .bak
pliki 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 -exec
z trash
poleceniem:
find . -name '*.bak' -xtype f -exec trash {} +
-xtype f
wybiera 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-existent
błędów .bak
plików w .bak
katalogach:
find . -name '*.bak' -execdir trash {} +
rm
do 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-cli
robi to samo, co gvfs-trash
bez zależności gvfs
.
find . -name "*.bak" -type f
co trash *.bak
usuwa. Czy to naprawdę masz na myśli? Możesz przenosić katalogi do kosza za pomocą trash
lub gvfs-trash
, ale trash *.bak
przenosi tylko pliki i katalogi, których nazwy kończą się na .bak
i które znajdują się natychmiast w bieżącym katalogu. Powłoka rozszerza się *.bak
, więc trash *.bak
nie wpłynie na .bak
pliki 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 .bak
pliki w dowolnym miejscu pod .
. Nie może używać aliasu, więc zamiast tego zainstaluj trash-cli
lub napisz gvfs-trash
. Oto przykład. -xtype f
wybiera 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 existent
błędów .bak
plików w .bak
katalogach. 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 ]:
d
jest opcją katalogu i f
opcją 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
?