Я хочу передать следующие команды конвейером, но последний cmd «rm -rf» не работает, т.е. ничего не удалено:
find /home/mba/Desktop/ -type d -name "logs" | sed 's/$/\/\*/' | rm -rf
Ошибка не возвращается.
Я хочу передать следующие команды конвейером, но последний cmd «rm -rf» не работает, т.е. ничего не удалено:
find /home/mba/Desktop/ -type d -name "logs" | sed 's/$/\/\*/' | rm -rf
Ошибка не возвращается.
Команда rm
не берет имена файлов из стандартного ввода. Если вы хотите перенаправить с sed
на rm
, вы можете использовать xargs
. Например:
find /home/mba/Desktop/ -type d -name "logs" | sed 's/$/\/\*/' | xargs rm -rf
Более простая форма:
find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -exec rm -fr -- {} +
Он будет соответствовать всем файлам, находящимся в любом каталоге с именем logs
.
Если xargs
по-прежнему предпочтительнее:
find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -print0 | xargs -0 rm -fr --
Вы можете ограничить количество файлов, удаляемых за один раз, с помощью -n
:
find /home/mba/Desktop/ -regex '.*/logs/[^/]+$' -print0 | xargs -0 -n 2000 rm -fr --
-print0
и -0
, чтобы использовать \x00
в качестве разделителя. Это обеспечит безопасность команды с именами файлов, содержащими пробелы.--
к rm
, чтобы мы могли удалять файлы, имена которых начинаются с -
.-wholename
. Но это также будет соответствовать файлам выше 1 уровня и вызовет ошибку позже, что файл не был найден полностью, потому что родительский элемент был удален перед ним. Или, может быть, rm -fr
все равно проигнорирует это, но это все еще неэффективно.
- person konsolebox; 19.07.2014
xargs
? И есть ли документ, в котором это упоминается?
- person konsolebox; 10.08.2014
«Стандартный ввод должен использоваться для чтения строки ввода в ответ на каждое приглашение, указанное в разделе STDOUT. В противном случае стандартный ввод не должен использоваться».
Источник: http://pubs.opengroup.org/onlinepubs/007904975/utilities/rm.html
Примеры:
yes n | rm -ir dir1 dir2 dir3 # won't delete dir1 dir2 dir3
yes y | rm -ir dir1 dir2 dir3 # delete dir1 dir2 dir3