Рассмотрим каталог с типичными именами файлов 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
\t
t