Назад | Перейти на главную страницу

Как работать с пробелами в скриптах

Я хочу найти определенные файлы на внешнем диске и удалить их. Я создал следующий сценарий (для проверки я использую только 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, которые препятствуют тому, чтобы место там испортилось