Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 用于查找的命令-行政长官{}+_Loops_Sh_Heredoc - Fatal编程技术网

Loops 用于查找的命令-行政长官{}+

Loops 用于查找的命令-行政长官{}+,loops,sh,heredoc,Loops,Sh,Heredoc,我正在尝试将TIFF图像文件的层次转换为JPG,出于厌倦,我想在单个文件中查找和ffmpeg 所以我将find设置为使用-s标志调用sh,如下所示: #!/bin/sh export IFS="" find "$@" -iname 'PROC????.tif' -exec sh -s {} + << \EOF for t ; do ffmpeg -y -v quiet -i $t -c:v mjpeg ${t%.*}.jpg rm $t done EOF 然而,目录层次结构中有

我正在尝试将TIFF图像文件的层次转换为JPG,出于厌倦,我想在单个文件中查找和ffmpeg

所以我将find设置为使用-s标志调用sh,如下所示:

#!/bin/sh
export IFS=""

find "$@" -iname 'PROC????.tif' -exec sh -s {} + << \EOF
for t ; do 
ffmpeg -y -v quiet -i $t -c:v mjpeg ${t%.*}.jpg
rm $t
done
EOF
然而,目录层次结构中有太多的文件,并且发现将文件名数组分割成了几个小块,而sh-s只是成功地为第一个参数块调用

问题是:如何将这样的inbody命令提供给find命令中的每个sh调用

更新


问题上的标签herdoc用于接收不依赖外部文件或通过$0进行自引用的答案。另外,文件名不会经过字符串数组处理,例如使用NUL终止符或换行符填充,并且可以直接作为参数传递

我正在下面重新编写您的代码:-

#!/bin/bash

find "$1" -name "PROC????.tif" > /tmp/imagefile_list.txt
while read filepath
do
    path=${filepath%/*}
    imgfile=${filepath##*/}
    jpgFile=${imgfile%.*}.jpg
    cd "$path"
    ffmpeg -y -v quiet -i "$imgfile" -c:v mjpeg "$jpgFile"
    rm -rf $imgfile
done < /tmp/imagefile_list.txt
如果您不想更改当前目录,可以按如下操作:-

#!/bin/bash

find "$1" -name "PROC????.tif" > /tmp/imagefile_list.txt
# If you list down all the .tif file use below command
# find "$1" -name "*.tif" > /tmp/imagefile_list.txt
while read filepath
do
    path=${filepath%/*}
    imgfile=${filepath##*/}
    jpgFile=$path${imgfile%.*}.jpg
    ffmpeg -y -v quiet -i "$filepath" -c:v mjpeg "$jpgFile"
    rm -rf $imgfile
done < /tmp/imagefile_list.txt

rm -rf /tmp/imagefile_list.txt

heredoc被用作查找的输入。我认为您最好的选择是根本不使用heredoc,而是使用字符串:

#!/bin/sh
find "$@" -iname 'PROC????.tif' -exec sh -c '
for t ; do 
ffmpeg -y -v quiet -i "$t" -c:v mjpeg "${t%.*}.jpg" &&
rm "$t"
done
' sh {} +

该程序假设imagefile_list.txt在当前工作目录中不会作为重要的东西存在。您并不真正理解。imagefile_list.txt脚本无法生成此文件?是。我很清楚sh如何处理-c标志,将-s与herdeoc结合使用的全部目的是为了更好地格式化。并且将列表保存到txt文件可以而且应该被管道替换。另外,path=${filepath%/*},如何确保$filepath不是相对路径?我在代码中没有这样做。请尝试在/tmp/imagefile_list.txt中创建。检查一下它是否对你有用。我只是想帮你。如果没有帮助,我会删除我的答案。这正是我在办公室里做的。你能解释一下为什么你认为我应该使用双引号而不是设置IFS=吗?一般来说,我认为设置IFS是相当脆弱的,并试图避免它。因为它似乎对这个问题不重要,所以我认为去掉它会澄清答案。添加双引号更多的是为了演示最佳实践,而不是其他任何东西。一般来说,将IFS设置为空字符串是不够的,因为未加引号的参数扩展仍然要进行路径名扩展,而不仅仅是分词。