Использование find с -exec rm в сценарии bash не работает, но работает по приглашению

Я удалил с помощью rm *.*, однако я все еще хотел бы знать, почему rm blahblah\r\n.txt и rm blahblah*.txt не работают...

0
27.03.2018, 22:43
2 ответа

Несмотря на лучшие общие решения, вот причина, по которой это не удалось в этом скрипте:

FINDOPTS="-type f -mtime +3 -exec rm -rf {} \;"
                                            ^

Параметр findожидает символ ;. Поскольку ;на самом деле (не случайно)также конец ограничителя команды оболочки, его необходимо экранировать в команде оболочки, поэтому обычно набирается \;. Если теперь вы поместите этот символ в переменную, он никогда не будет оцениваться оболочкой как разделитель. Таким образом, его нельзя экранировать.

Воспроизведение ошибки без переменной:

$ find /etc -exec ls "\;"
find: missing argument to `-exec'

Так что просто замените строку на:

FINDOPTS="-type f -mtime +3 -exec rm -rf {} ;"
4
28.01.2020, 02:16

Вместо find [...] -exec rmя предлагаю использовать встроенный -функционал :

.
find [...] -delete

Из инструкции:

 -delete
         Delete found files and/or directories.  Always returns true.  This executes 
         from the current working directory as find recurses down the tree.  It will 
         not attempt to delete a filename with a ``/'' character in its pathname 
         relative to ``.'' for security reasons.  Depth-first traversal processing 
         is implied by this option.  Following symlinks is incompatible with this 
         option.

(между прочим, вы понимаете, что команда в вашем вопросе удалит любые файлы старше трех дней с момента их последней модификации, да?)

2
28.01.2020, 02:16

Теги

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