我正在尝试将TIFF图像文件的层次转换为JPG,出于无聊,我希望在单个文件中执行find
和ffmpeg
。
所以我将find
设置为使用sh
标志调用-s
,就像这样:
#!/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
只能成功调用第一个参数块。
问题是:如何在sh
命令中为每个find
调用提供这样的体内命令?
更新
问题上的“heredoc”标签用于接收不依赖于外部文件或通过$0
进行自我引用的答案。它也意味着没有文件名将通过字符串数组处理,例如使用NUL终止符或换行符进行填充,并且可以直接作为参数传递。
答案 0 :(得分:1)
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 {} +
答案 1 :(得分:0)
我正在重写下面的代码: -
#!/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