IFS=$(echo -en "\n\b")
でシェルを想定していて、echo -eとにかくシバン行にbashがあるので、を使用できますIFS=$'\n\b'。バックスペースをセパレーターにするのはかなり奇妙です。IFSとにかく何をしている必要はありません。
OLDIFS=$IFS
…
IFS=$OLDIFS
これは、が最初に設定されたIFS場合IFSにのみ、の古い値を復元することに注意してください。もしはIFS、このセットを最初に設定解除されたIFS完全に異なっている空の文字列に。ksh、bash、またはzshでは、IFS一時的に設定する必要がある場合は、関数にコードを記述して、IFSこの関数に対してローカルにすることができます。他のシェルでは、未設定のケースに注意する必要があります。
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
の出力でコマンド置換を使用しないでくださいfind。
- これにより、出力がの文字で分割され
$IFSます。IFS改行を設定すると、出力は改行で分割されますが、改行を含むファイル名は処理できません。
- コマンド置換の結果が単語に分割されるだけでなく、各単語がグロブパターンとして使用されます。あなたが呼ばれるファイルをした場合
A[12].pdf、A1.pdf及びA2.pdf、あなたがになってしまいますA1.pdf A2.pdf A1.pdf A2.pdf。でグロビングをオフにset -f(およびでオンに戻すset +f)できますが、ここでは(ほとんどの場合と同様)、コマンド置換を使用しないのが正しい方法です。
-execへの引数を使用しますfind(または、システムにがある場合は-print0、find … -print0 | xargs -0 …代わりに使用できます。これは、以前のLinuxシステムまたはを備えて-print0いない現在のOpenBSDシステムへの移植性が必要な場合に、一度に複数のファイルを操作する場合にのみ役立ちます-exec … {} +)。
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
周りに二重引用符$fがないことに注意してください(これらが分割の結果でありIFS、それ以降変更されておらず、グロビングがオフになっている場合は必要ありませんが、実際には、二重引用符を配置する理由がわからない限り、常に二重引用符を付けてください) tオンのままにします)。
これは不格好で移植性statがありません(すべてのシステムに存在するわけではなく、その引数は、存在するさまざまなシステム間で異なります)。touchには、ファイルを別のファイルのタイムスタンプに設定するポータブルオプションがあります:touch -r REFERENCE_FILE FILE。代わりに次の2つの方法のいずれかをお勧めします。
- 可能であれば、最初に元のファイルを新しいファイルに変換し、次にを呼び出し
touch -rて新しいファイルの日付を設定し、最後に新しいファイルを所定の場所に移動します。入力に何かが発生する前に、出力に問題がないことを確認することをお勧めします。そうしないと、変換がなんらかの理由(停電など)で中断された場合、データが失われます。
- 変換が制御できないブラックボックスである場合、
touch -r2回使用できます。1回目は元のファイルの日付を空の一時ファイル(自動的に作成されます)に保存し、次に変換後に再び日付を復元します。一時ファイルを使用します。
したがって:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFS珍しいようです。バックスペース(\b)で分割しますか?ヒントについては、unix.stackexchange.com / questions / 9496 /…を参照してください。