Я хочу найти определенные файлы на внешнем диске и удалить их. Я создал следующий сценарий (для проверки я использую только ls $ i для проверки вывода)
for i in `find /media/My\ Book/ -name "OP_CACHE.IDX" -print`;
do ls $i;
done
Проблема в том, что команда find возвращает только строки, в которых пробелы (например, «Моя книга») не закодированы (как я делаю в / media / My \ Book), и поэтому я получаю ошибки, что папки не могут быть найдены.
Как я могу решить эту проблему с пробелами? Есть ли флаг для поиска, что ли?
С уважением, Марк
Там является флаг для find
, и он используется так:
find "/media/My Book" -name "OP_CACHE.IDX" -exec ls {} \;
Это тоже можно использовать:
find "/media/My Book" -name "OP_CACHE.IDX" -print0 | xargs -0 ls
(The -print0
аргумент говорит find
разделять имена файлов нулевыми байтами, а не символами новой строки. В большинстве современных файловых систем (например, ext3 и NTFS) имена файлов могут содержать не только пробелы, но и символы новой строки, табуляции, все, кроме нулевого байта. Хотя маловероятно, что на вашем собственном диске будут такие имена файлов, я стараюсь с этим быть осторожным.)
Если вы собираетесь просто удалить файлы позже, find
тоже может это сделать:
find "/media/My Book" -name "OP_CACHE.IDX" -delete
(Вы даже можете использовать -print -delete
чтобы увидеть каждый файл по мере его удаления.)
Если вам абсолютно необходимо использовать цикл bash, это будет работать большую часть времени:
find "/media/My Book" -name "OP_CACHE.IDX" | while read file; do ls "$file" done
Но см. Комментарий о -print0
выше.
Вы должны трубить свой find
в while read
:
find ... | while read i
Вместо того, чтобы использовать for ...
, используйте while read
, вот так:
find .... | while read LINE ; do
ls "$LINE"
done
Он будет читать по одной строке за раз и помещать ее в LINE
переменная. Таким образом, не имеет значения, не выходит ли find из пробелов. Я также завернул ls в "
's, которые препятствуют тому, чтобы место там испортилось