Czy „pliki rm *” usuwają wszystkie dopasowania ze wszystkich podkatalogów?

13

Chcę usunąć dowolny plik, który wygląda jak wordpress-891.sqlw bieżącym katalogu (nie w podkatalogach).

Czy rm wordpress-*.sqlzrobi lewę, czy też usunie dopasowania z podkatalogów?

HorusCoding
źródło
1
Nawiasem mówiąc, podczas gdy wszystkie pozostałe odpowiedzi są poprawne, jest jeszcze jeden zwrot: w rzeczywistości to bash, a nie polecenie rm, rozwija znak wieloznaczny. Jeśli masz dziesięć pasujących plików w katalogu, rm nie zobaczy znaku wieloznacznego, a raczej dziesięć pojedynczych argumentów. Jeśli chcesz, aby rm dokonał rozszerzenia, musisz zawrzeć swój argument w pojedynczych cudzysłowach. Dla rm nie robi to różnicy, ale w innych kontekstach może. Zwykle, gdy symbol wieloznaczny odnosi się do czegoś innego niż pliki, na przykład do pakietów apt-get.
Kevin Keane
3
@KevinKeane, rmnie robi rozszerzenia nazwy pliku ... rm "foo*"spróbuje usunąć plik z dosłowną gwiazdką w nazwie.
ilkkachu

Odpowiedzi:

20

Nie. Normalne globowanie *nie jest rekurencyjne i nie jest rm.

Jeśli nazwa katalogu pasuje, nie zostanie usunięta - potrzebujesz -rflagi, aby usunąć katalog.

Jest to bezpieczne, jeśli masz pewność, że chcesz usunąć te pliki.

Możesz także uczynić rminteraktywnym

rm -i wordpress-*.sql

następnie poprosi o potwierdzenie przed usunięciem każdego pliku

Zanna
źródło
14

Tak, to załatwia sprawę i usuwa wszystkie pliki z tym schematem w bieżącym katalogu. I NIE, nie usuwa plików z podkatalogów.

Kiedykolwiek nie masz pewności, co się stanie po uruchomieniu polecenia, takiego jak:

rm wordpress-*.sql

następnie uruchom go za pomocą ls:

ls wordpress-*.sql

pliki, które zobaczysz w danych wyjściowych, zostaną usunięte.

Kiedy próbujesz uzyskać listę typu: foo*lepiej użyć -dprzełącznika z, lsaby zapobiec wyświetlaniu plików z katalogiem o nazwie foobar/itp.

ls -d foo*

Ta sztuczka działa w przypadku poleceń, które nie są używane do rekurencyjnego wykonywania zadania.

Inną rzeczą, którą możesz zrobić, to wpisać żądane dane wejściowe, np .: wordpress-*naciśnij Ctrl+ Alt+ *, a teraz wszystkie dopasowania są wpisywane automatycznie przed poleceniem.

Ravexina
źródło
4
Moja ulubiona metoda:printf "%s\n" wordpress-*.sql
wjandrea
1
Możesz także udawać, że Echo echo rm file*. Zwłaszcza szukaj wrogich nazw plików, takich jak-rf
eckes
@eckes: Można pokrycie tych bardziej bezpiecznie z albo rm ./*albo rm -- *.
David Foerster
Tak lub skorzystaj z xargs -0@DavidFoerster
eckes
jeśli przejdziesz ls foo*i masz katalog o nazwie foobar, otrzymasz również listę zawartości tego katalogu, więc zwykły lsnie jest tak naprawdę najlepszym sposobem na to, co rmtrafi
ilkkachu
12

Nie, rmnie powtarza się w podkatalogach.

Zobacz Usuwanie pasujących plików we wszystkich podkatalogach - SuperUser, aby uzyskać informacje na temat metod usuwania plików w podkatalogach.

Jeśli kiedykolwiek martwisz się przypadkowym usunięciem czegoś ważnego, użyj gvfs-trash(który wysyła pliki do kosza) zamiast rm(który trwale usuwa pliki).

wjandrea
źródło
Dzięki za gvfs-trashwzmiankę nauczyłem się czegoś, czego dziś prawie nie używam ...
George Udosen
-1

Jeśli chcesz znaleźć i usunąć wszystkie pasujące pliki, takie jak wordpress-*.sql, możesz użyć findpolecenia. :)

Na przykład, chcesz usunąć wszystkie pasujące pliki z wordpress-*.sqlunder test_dir, wykonaj następujące czynności.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Ilekroć findprogram naprawdę znajdzie pasujący plik, próbuje wykonać polecenie następujące po -execopcji. W takim przypadku rm -f {}zostanie wykonany i {}zostanie zmieniony na nazwę pliku dopasowania. Na przykład

rm -f wordpress-169.sql

Możesz również ustawić głębokość podkatalogów za pomocą -maxdepthopcji.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Pamiętaj, że musisz określić -maxdepthopcję przed innymi opcjami. W przeciwnym razie możesz osiągnąć wyniki, których tak naprawdę nie chcesz zobaczyć.

Sung-Jin Park
źródło
1
OP chce czegoś przeciwnego: nie powracać do podkatalogów.
Melebius
2
GNU find: „opcje wpływają na wszystkie testy, w tym testy określone przed opcją”, zawiera poniższa lista opcji -maxdepth. Użyj -exec rm -f {} +raczej niż -exec \;, lub jeszcze lepiej, po prostu-delete
ilkkachu