Удаление файлов, которые не заканчиваются на -out

Как мне удалить все файлы в каталоге и его подкаталогах, которые не заканчиваются на -out? Например, удалите foo.bar, но не удалите foo-out.bar.

РЕДАКТИРОВАТЬ:

Я пытался

for a_file in $(find .  ! -name '*-out*'); do rm  $a_file; done;

Но этот сценарий не включает пробелы. Как бы я это исправить?

0
задан 29 August 2013 в 04:25

2 ответа

Как насчет использования встроенного действия -delete команды find? это должно быть безопасным для пробелов

find . ! -name '*-out*' -type f -delete

В противном случае, вы можете сделать цикл while с нулевым символом в конце - убедитесь, что вы также указали переменную имени файла

while read -rd \0' f; do rm "$f"; done < <(find . ! -name '*-out*' -type f -print0)
0
ответ дан 29 August 2013 в 04:25

В дополнение к ответу.

Вам не нужно использовать цикл 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 {} \; для подтверждения удаление.

0
ответ дан 29 August 2013 в 04:25

Другие вопросы по тегам:

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