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 -r
2回使用できます。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 /…を参照してください。