Как мне удалить все файлы в каталоге и его подкаталогах, которые не заканчиваются на -out? Например, удалите foo.bar
, но не удалите foo-out.bar
.
РЕДАКТИРОВАТЬ:
Я пытался
for a_file in $(find . ! -name '*-out*'); do rm $a_file; done;
Но этот сценарий не включает пробелы. Как бы я это исправить?
Как насчет использования встроенного действия -delete
команды find
? это должно быть безопасным для пробелов
find . ! -name '*-out*' -type f -delete
В противном случае, вы можете сделать цикл while с нулевым символом в конце - убедитесь, что вы также указали переменную имени файла
while read -rd \0' f; do rm "$f"; done < <(find . ! -name '*-out*' -type f -print0)
В дополнение к ответу.
Вам не нужно использовать цикл for. find
обеспечивает -exec
и -delete
.
Быстрый тест
cd `mktemp -d`
touch {1..9}\ -out{a..c}
$ find . -name '*-out*'
./2 -outb
./8 -outb
./9 -outa
./4 -outc
./6 -outb
./5 -outc
./7 -outb
./9 -outb
./2 -outa
./4 -outa
./8 -outc
./8 -outa
./7 -outc
./3 -outb
./6 -outa
./3 -outa
./1 -outb
./9 -outc
./1 -outa
./5 -outa
./4 -outb
./3 -outc
./1 -outc
./5 -outb
./2 -outc
./7 -outa
./6 -outc
Работает с пробелами.
Вам нужно:
find . ! -name '*-out*' -exec rm -f {} \;
Более безопасная альтернатива: find . -name '*-out*' -exec rm -i {} \;
ПРИМЕЧАНИЕ : используйте -exec rm -i {} \;
для подтверждения удаление.