оболочка для цикла с поиском файлов с именами, содержащими пробелы

оболочка для цикла с поиском файлов с именами, содержащими пробелы

Рассмотрим каталог с типичными именами файлов Microsoft Windows:

Новый документ.txt
Фу.doc
Foo - Копия.doc

Я хотел бы сделать что-то с каждым файлом, например:

для sendfile в $(find ${POLLDIR} -type f -mmin +1 -print0)
делать
  эхо \"${sendfile}\"
  ls -l "${sendfile}"
  и так далее
  если успех_выше
  затем
    mv "${sendfile}" "${donedir}/."
  фи
сделанный

Обратите внимание, что я не хочу просто запустить 1 команду с "${sendfile}" в качестве аргумента. Мне нужен цикл для проверки ошибок и других вещей (например, перемещение "${sendfile}" при успешном выполнении и запись в журнал при неудаче).

Какая "правильная" конструкция для экранирования/кавычек имен файлов из find, чтобы я мог использовать их в for, как в lsкоманде выше? Если возможно, я бы хотел избежать сохранения имен файлов во временном файле по одному.

Я не думаю, что, find -printf '"%p"\n'как предположил triplee в комментариях к вопросу [Как использовать find, если имя файла содержит пробелы?] будет работать в for foo in $(...) doконструкции.

Думаю, замена "недопустимых" символов ?на сработает в этом случае, но это будет очень некрасиво. Цикл for в конечном итоге обрабатывает файлы в ${POLLDIR}, а затем перемещает их по завершении, поэтому вероятность столкновения "Foo bar.txt" с "Foo-bar.txt" равна 0 (-ish).

Моя лучшая попытка на данный момент:

для sendfile в $(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?')
делать
  ...
сделанный

Есть ли какие-нибудь более чистые предложения?

решение1

Используйте find ... -print0 | while IFS="" read -d ""конструкцию:

find "${POLLDIR}" -type f -mmin +1 -print0 | while IFS="" read -r -d "" sendfile
  do
    echo "${sendfile}"
    ls -l "${sendfile}"
    and-so-on
    if success_above
      then
        mv "${sendfile}" "${donedir}/."
    fi
done

Устанавливает -d ""символ конца строки на ноль ( \0), который разделяет каждое найденное имя файла, find ... -print0и IFS=""необходим для работы с именами файлов, содержащими новые строки — согласно POSIX запрещены только слеши ( /) и ноль ( ). гарантирует, что обратные слеши не экранируют символы (например, соответствует фактическому обратному слешу, за которым следует а , а не табуляции).\0-r\tt

Связанный контент