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

17

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

user15586
источник

Ответы:

35

Чтобы прямо ответить на ваш вопрос, «нет - вы не можете делать то, что вы описываете 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
кроличий садок
источник
1
правда - если вы пропустите последнюю трубу, вы сначала получите список всего :)
Уоррен
2
Может не отвечать прямо на вопрос автора, но ближе всего они доберутся до того, что хотят.
Дракия
1
Гном, разве это не горько без причины?
Gnoupi
10
Пожалуйста, будьте очень осторожны при использовании find | grep | xargs rm. Если есть файлы с пробелами (или символами новой строки), это приведет к разрыву (и в зависимости от имен файлов и мест, где они находятся) может привести к удалению того, что вы не собирались удалять. find … -print0 | xargs -0 rmбудет гораздо надежнее. Однако это будет означать, что вы не можете использовать grepи должны использовать findпредикаты, чтобы сопоставлять и печатать только нужные файлы. Второй пример Уоррена будет более надежным find -type f -name '*~' -print0 | xargs -0 rm.
Крис Джонсен
1
Если вы хотите, чтобы одна команда выполняла эту работу, создайте псевдоним, используя одну из указанных команд поиска. Ответьте на это позже, если хотите.
случайный пользователь
8

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

Нет.

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

Используя Bash, с globstarset, да :

rm basedir/**/my*pattern*

Попробуйте, например, ls -1сначала, прежде чем rmперечислить файлы, которые вам подходят.

Вы устанавливаете параметры, например, через shopt -s globstar.


Альтернативно, более короткий findвариант:

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

или для GNU find:

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

или другой вариант для не-GNU find(немного медленнее):

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

Чтобы также удалить каталоги, как вы просите: только изменения rmв rm -rв приведенных выше команд и пропустить согласования на только -type fв findкомандах.

Даниэль Андерссон
источник
0

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

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

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

% rm -rf ** / <pattern>

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

kaleissin
источник