
一般的なMicrosoft Windowsファイル名のディレクトリを考えてみましょう。
新しいドキュメント.txt Foo.doc フー - copy.doc
各ファイルに対して次のことをしたいと思います。
$(find ${POLLDIR} -type f -mmin +1 -print0) の sendfile の場合 する echo "${sendfile}" ls -l "${sendfile}" など。 成功した場合 それから mv "${sendfile}" "${donedir}/." フィリピン諸島 完璧
「${sendfile}」を引数として使用してコマンドを実行したくありません。エラーチェックやその他の操作(成功した場合は「$ {sendfile}」を移動し、失敗した場合はロギング)を実行するにはループが必要です。
ls
上記のコマンドのように、forで使用できるようにfindでファイル名をエスケープ/引用する「正しい」設定は何ですか?可能であれば、一時ファイルにファイル名を1つずつ保存することは避けたいと思います。
find -printf '"%p"\n'
トリプルがコメントで尋ねた問題ではないようです[ファイル名にスペースが含まれている場合は、検索を使用する方法は?]for foo in $(...) do
コンストラクタで動作します。
私はこの場合、「違法な」文字を変えることは私にとってはうまくいくと思います?
が、それは非常に見苦しいでしょう。 forループは最終的に$ {POLLDIR}のファイルを処理し、完了するとファイルを移動するため、「Foo bar.txt」が「Foo-bar.txt」と競合する可能性は0(-ish)です。
これまでの最善の試みは次のとおりです。
$(find ${POLLDIR} -type f -mmin +1 -print | tr ' ' '?') の sendfile の場合 する ... 完璧
よりクリーンなソリューションの提案がありますか?
答え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 ""
行末文字をnull()に設定します\0
。この文字は、見つかった各ファイル名を区切る文字でfind ... -print0
あり、改行文字を含むファイル名にも必要です。 POSIXによっては、IFS=""
スラッシュ()とnull()のみが禁止されます。バックスラッシュが文字をエスケープしないことを確認してください(たとえば、実際のバックスラッシュの後にタブ文字以外の文字が続くものと一致します)。/
\0
-r
\t
t