我正在尝试运行一个简单的bash脚本,但我正在努力解决如何操作条件。任何指针。循环说。我想加入一个条件,当gdalinfo无法打开图像时,它会将该特定文件复制到另一个位置。
for file in `cat path.txt`; do gdalinfo $file;done
可以正常打开图像,还可以显示哪些图像无法打开 错误的代码是
for file in `cat path.txt`; do gdalinfo $file && echo $file; else cp $file /data/temp
答案 0 :(得分:6)
再次,一次又一次 - 再次zilion ......
请勿使用
之类的结论for file in `cat path.txt`
或
for file in `find .....`
for file in `any command what produces filenames`
因为当文件名或路径包含空格时,代码将立即BREAK。永远不要将它用于任何产生文件名的命令。不好的做法。很坏。这是错误的,错误的,错误的,不准确的,不准确的,不精确的,错误的,错误的。
正确的形式是:
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
但是这里cat
没用,(实际上 - 命令仅将文件复制到STDOUT 无用)。你应该使用
while read -r file
do
#whatever
done < path.txt
它更快(不会分叉新进程,就像每个管道一样)。
如果文件名也包含空格,上面的while
会将corect文件名填充到变量file
中。 for
不会。期。 UFF。 OMG。
出于同样的原因,请使用"$variable_with_filename"
代替纯$variable_with_filename
。如果文件名包含空格,则任何命令都会将其误解为两个文件名。这可能不是,你想要的......
因此,请包含任何包含带双引号的文件名的shell变量。 (不仅是文件名,还包含任何可以包含空格的东西)。 "$variable"
是正确的。
如果我理解正确,当/data/temp
返回错误时,您希望将文件复制到gdalinfo
。
while read -r file
do
gdalinfo "$file" || cp "$file" /data/temp
done < path.txt
美观,简短且安全(至少如果你的path.txt每行真的包含一个文件名)。
也许,你想要多次使用你的脚本,因此不要在里面输出文件名,而是将脚本保存在表格中
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
Howgh。
答案 1 :(得分:1)
你可以说:
for file in `cat path.txt`; do gdalinfo $file || cp $file /data/temp; done
如果gdalinfo无法打开图像,则会将文件复制到/data/temp
。
如果您想要在出现故障时复制文件名,请说:
for file in `cat path.txt`; do gdalinfo $file || (echo $file && cp $file /data/temp); done