используйте rm для рекурсивного удаления файлов и каталогов

19242
user15586

Можно ли использовать rm для рекурсивного удаления файлов и каталогов, соответствующих шаблону, без использования других команд?

17

5 ответов на вопрос

35
warren

Чтобы прямо ответить на ваш вопрос, «нет - вы не можете делать то, что вы описываете с rm».

Вы можете, однако, сделать это, с чем вы сочетаете это find. Вот один из многих способов сделать это:

 # search for everything in this tree, search for the file pattern, pipe to rm find . | grep <pattern> | xargs rm 

Например, если вы хотите уничтожить все файлы * ~, вы можете сделать это так:

 # the $ anchors the grep search to the last character on the line find . -type f | grep '~'$ | xargs rm 

Чтобы развернуть из комментария * :

 # this will handle spaces of funky characters in file names find -type f -name '*~' -print0 | xargs -0 rm 
IMO: Это лучший ответ, потому что вы можете просмотреть файлы, которые будут удалены до того, как они будут удалены. monksy 14 лет назад 0
true - если вы пропустите последний канал, вы сначала получите список всего :) warren 14 лет назад 1
@steven И все же, на самом деле он не ответил на вопрос автора A Dwarf 14 лет назад 0
Итак, мой -1 к этому A Dwarf 14 лет назад 0
Может не отвечать прямо на вопрос автора, но ближе всего они доберутся до того, что хотят. Drakia 14 лет назад 2
Гном, разве это не горько без причины? Gnoupi 14 лет назад 1
Пользователь отправляет простой вопрос. Может ли он сделать это только с помощью команды rm? Он не спрашивал, как он мог это сделать. Для всего, что имеет значение, он может знать другие способы, которыми он может это сделать. И все же, совершенно достоверные ответы на его вопрос были отвергнуты без четкой причины. Почему я не должен опускать ответ, который не прилагает усилий, чтобы ответить на фактический вопрос? A Dwarf 14 лет назад 0
ответ «нет - вы не можете делать то, что вы описываете с помощью« rm »». Я показал ему, как он * может * сделать это, если захочет. warren 14 лет назад 0
Пожалуйста, будьте очень осторожны, используя `find | grep | xargs rm`. Если есть файлы с пробелами (или символами новой строки), это может привести к разрыву (и в зависимости от имен файлов и мест, где они находятся) может привести к удалению того, что вы не собирались удалять. `найти… -print0 | xargs -0 rm` будет намного надежнее. Однако это будет означать, что вы не можете использовать `grep` и должны использовать предикаты` find`, чтобы сопоставлять и печатать только нужные файлы. Второй пример Уоррена будет более надежным: `find -type f -name '* ~' -print0 | xargs -0 rm`. Chris Johnsen 14 лет назад 10
@Chris - обновил мой ответ warren 14 лет назад 0
@warren после вашего обновления удалил мое даунвот A Dwarf 14 лет назад 0
Если вы хотите, чтобы одна команда выполняла эту работу, создайте псевдоним, используя одну из указанных команд поиска. Ответьте на это позже, если хотите. casualuser 14 лет назад 1
Вам не нужны более забавные символы, чем пробел, чтобы убить ваши первые примеры и, возможно, удалить другие файлы, которые не нужны. Я рекомендую вам изменить их, по крайней мере, используя `xargs -d '\ n'`, чтобы разрешить пробелы. Но ваш первый пример превосходит два первых примера, так что, возможно, просто пропустите их. Они медленнее и менее надежны. Daniel Andersson 11 лет назад 0
8
Drakia

«без использования других команд»

Нет.

Хороший ответ, иллюстрирующий дискуссию «строго ответь на первоначальный вопрос (рискуя оказаться неспособным предоставить решение)» и «предоставь решение, даже если оно не совсем соответствует введенным ограничениям». Gnoupi 14 лет назад 0
Я только опубликовал это, поскольку "Гном" жаловался на ответ, который фактически обеспечил решение. Без использования других команд действительно невозможно рекурсивное удаление ** файла **, которое соответствует шаблону, только удаление файла / каталога из текущего каталога. Drakia 14 лет назад 0
3
Daniel Andersson

Using Bash, with globstar set, yes:

rm basedir/**/my*pattern* 

Try it with e.g. ls -1 first, before rm to list the files you match.

You set options through e.g. shopt -s globstar.


Alternatively, a shorter find variant:

find -type f -name 'my*pattern*' -delete 

or for GNU find:

find -type f -name 'my*pattern*' -exec rm {} + 

or another alternative for non-GNU find (a bit slower):

find -type f -name 'my*pattern*' -exec rm {} \; 

To also remove directories, as you ask for: just change rm into rm -r in the above commands and skip matching on only -type f in the find commands.

0
ianfuture

Я бы сказал "rm -rf", где комбинация имен файлов и соответствующих шаблонов, таких как * и? и т. д. (например, todays_log_2009 ????. log). Это начнется с текущего Dir и рекурсивно удалит файлы, которые соответствуют этому шаблону.

Это не будет работать, потому что шаблон расширяется оболочкой в ​​текущем каталоге. Если указан в кавычке, шаблон становится именем файла со специальными символами в нем. например, чтобы удалить файл [, можно написать rm '['. Узор просто теряет смысл. casualuser 14 лет назад 0
0
kaleissin

Если вы используете zsh (1), включите «расширенную глобализацию» с помощью setopt extendedglob.zshrc. Префикс шаблона '** /' затем рекурсивно удалит:

% rm -rf ** / <pattern>

Однако, если есть много файлов, которые нужно удалить, вы должны прибегнуть к поиску (1) с помощью xargs (1) или -exec, и я также рекомендую делать это в сценариях оболочки.

Похожие вопросы