何度も何度も - ジリオン th また...
次のような構造を使用しないでください
for file in `cat path.txt`
また
for file in `find .....`
for file in `any command what produces filenames`
ファイル名またはパスにスペースが含まれていると、コードがすぐに壊れるためです。ファイル名を生成するコマンドには絶対に使用しないでください。悪い習慣。ひどい。それは間違っている、間違っている、誤っている、不正確である、不正確である、不正確である、不完全である、間違っている。
正しい形式は次のとおりです。
for file in some/* #if want/can use filenames directly from the filesystem
また
find . -print0 | while IFS= read -r -d '' file
または(ファイル名に改行が含まれていないことが確実な場合)使用できます
cat path.txt | while read -r file
しかし、ここでは役に立ちません(実際には、ファイルをSTDOUTにコピーするだけcat
のコマンドは役に立ちません)。代わりに使用する必要があります
while read -r file
do
#whatever
done < path.txt
高速です (すべてのパイプの場合のように、新しいプロセスをフォークしません)。
上記while
の s はfile
、ファイル名にスペースも含まれている場合に、正しいファイル名を変数に入力します。for
しません。限目。うーん。ああ、神様。
同じ理由"$variable_with_filename"
で純粋の代わりに使用します。$variable_with_filename
ファイル名に空白が含まれている場合、コマンドはそれを 2 つのファイル名と誤解します。これはおそらくそうではありません、あなたも欲しいもの..
そのため、ファイル名を含むシェル変数は二重引用符で囲みます。(ファイル名だけでなく、スペースを含むものすべて)。"$variable"
正しい。
私が正しく理解していれば、エラーが返され/data/temp
たときにファイルをコピーする必要があります。gdalinfo
while read -r file
do
gdalinfo "$file" || cp "$file" /data/temp
done < path.txt
素晴らしく、短く、安全です (少なくとも、path.txt に実際に 1 行に 1 つのファイル名が含まれている場合)。
また、スクリプトをより多く使用したい場合は、ファイル名を内部に含めずに、スクリプトをフォームに保存します。
while read -r file
do
gdalinfo "$file" || cp "$file" /data/temp
done
次のように使用します。
mygdalinfo < path.txt
より普遍的な...
gdalinfo
おそらく、エラーを返すもののファイル名のみを表示したい
while read -r file
do
gdalinfo "$file" || printf "$file\n"
done
をに変更するprintf "$file\n"
とprintf "$file\0"
、スクリプトをパイプで安全に使用できるようになります。
while read -r file
do
gdalinfo "$file" || printf "$file\0"
done
たとえば、次のように使用します。
mygdalinfo < path.txt | xargs -0 -J% mv % /tmp/somewhere
なんて。