用于查找的Heredoc命令。 -exec sh {} +

时间:2018-04-04 04:28:21

标签: loops sh heredoc

我正在尝试将TIFF图像文件的层次转换为JPG,出于无聊,我希望在单个文件中执行findffmpeg

所以我将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终止符或换行符进行填充,并且可以直接作为参数传递。

2 个答案:

答案 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