Mam tę listę plików na serwerze Linux:
abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10
Usunąłem wybrane pliki dziennika jeden po drugim, używając polecenia rm -rf
patrz poniżej:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Czy jest inny sposób, abym mógł od razu usunąć wybrane pliki?
GNU
jest potrzebny?Odpowiedzi:
Bash obsługuje wszystkie rodzaje symboli wieloznacznych i rozszerzeń.
Twój dokładny przypadek byłby obsługiwany przez rozwinięcie nawiasów , na przykład:
Powyższe rozwinęłoby się do jednego polecenia ze wszystkimi trzema argumentami i byłoby równoważne wpisaniu:
Należy zauważyć, że ta ekspansja jest wykonywana przez powłokę, zanim
rm
jeszcze zostanie załadowana.źródło
Użyj symbolu wieloznacznego (
*
), aby dopasować wiele plików.Na przykład poniższe polecenie usunie wszystkie pliki z nazwami zaczynającymi się od
abc.log.2012-03-
.Zalecam uruchomienie,
ls abc.log.2012-03-*
aby wyświetlić listę plików, aby zobaczyć, co zamierzasz usunąć przed uruchomieniemrm
polecenia.Aby uzyskać więcej informacji, zobacz stronę podręcznika Bash dotyczącą rozszerzania nazw plików .
źródło
Jeśli chcesz usunąć wszystkie pliki, których nazwy pasują do określonego formularza, najprostszym rozwiązaniem jest użycie symbolu wieloznacznego (wzorzec glob). Kilka przykładów:
Wyrażenia regularne mają większe możliwości niż symbole wieloznaczne; możesz podać wyjście
grep
dorm -f
. Na przykład, jeśli niektóre nazwy plików zaczynają się od,"abc.log"
a inne od"ABC.log"
,grep
umożliwia dopasowanie bez rozróżniania wielkości liter:Spowoduje to problemy, jeśli którakolwiek z nazw plików zawiera zabawne znaki, w tym spacje. Bądź ostrożny.
Kiedy to robię,
ls | grep ...
najpierw uruchamiam polecenie i sprawdzam, czy generuje dane wyjściowe, których potrzebuję - zwłaszcza jeśli używamrm -f
:gdzie
!!
rozwija się do poprzedniego polecenia. Lub mogę wpisać strzałkę w górę lub Ctrl-P i edytować poprzednią linię, aby dodaćrm -f
polecenie.Zakłada się, że używasz powłoki bash. Niektóre inne powłoki, szczególnie csh i tcsh oraz niektóre starsze powłoki wyprowadzone z sh, mogą nie obsługiwać
$(...)
składni. Możesz użyć równoważnej składni backtick:Plik
$(...)
Składnia jest bardziej czytelna, a jeśli jesteś naprawdę ambitny może być zagnieżdżona.Wreszcie, jeśli podzbioru plików, które chcesz usunąć, nie można łatwo wyrazić za pomocą wyrażenia regularnego, sztuczka, której często używam, polega na umieszczeniu plików w tymczasowym pliku tekstowym, a następnie edytowaniu go:
Mogę wtedy
list
ręcznie edytować plik, pozostawiając tylko te pliki, które chcę usunąć, a następnie:lub
(Ponownie zakłada się, że żadna z nazw plików nie zawiera zabawnych znaków, zwłaszcza spacji).
Lub podczas edycji
list
pliku mogę dodaćrm -f
na początku każdego wiersza, a następnie:lub
Edycja pliku to także możliwość dodania cytatów w razie potrzeby, na przykład zmiany
rm -f foo bar
narm -f 'foo bar'
.źródło
Po prostu użyj wysublimowanego wyboru wielowierszowego, aby połączyć wszystkie pliki w jedną linię i dodać spację między każdą nazwą pliku, a następnie dodać
rm
na początku listy. Jest to szczególnie przydatne, gdy w nazwach plików, które chcesz usunąć, nie ma wzorca.źródło
Dzika karta dobrze by się do tego nadawała, chociaż dla bezpieczeństwa najlepiej byłoby, aby jej użycie było jak najmniejsze, więc coś w tym stylu:
Chociaż wygląda na to, że to tylko pojedyncze pliki? Opcja rekurencyjna nie powinna być konieczna, jeśli żaden z tych elementów nie jest katalogiem, więc najlepiej jej nie używać, tylko ze względów bezpieczeństwa.
źródło
Nie jestem guru Linuksa, ale wierzę, że chcesz przesłać swoją listę plików wyjściowych
xargs rm -rf
. Użyłem czegoś takiego w przeszłości z dobrymi wynikami. Najpierw przetestuj na przykładowym katalogu!EDYCJA - mogłem źle zrozumieć, na podstawie innych pojawiających się odpowiedzi. Jeśli możesz używać symboli wieloznacznych, świetnie. Założyłem, że Twoja oryginalna lista, którą wyświetlasz, została wygenerowana przez program, aby dać Ci wybór, więc pomyślałem, że najlepszym
xargs
rozwiązaniem będzie przekierowanie do.źródło
jeśli chcesz jednocześnie usunąć wszystkie pliki należące do katalogu. Na przykład: nazwa katalogu to „log”, a katalog „log” zawiera pliki abc.log.2012-03-14, abc.log.2012-03-15, ... itd. Musisz znajdować się nad katalogiem dziennika i:
źródło