查找的 Heredoc 命令。 -exec sh {} +
Heredoc commands for find . -exec sh {} +
我正在尝试将 TIFF 图像文件的层次结构转换为 JPG,出于无聊,我想在单个文件中执行 find
和 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
仅在第一个参数块中成功调用。
问题是:如何将这样的体内命令提供给 find
命令中的每个 sh
调用?
更新
问题上的标签 "heredoc" 旨在接收不依赖于外部文件或通过 [=19=]
自引用的答案。它还旨在让任何文件名都不会经过字符串数组处理,例如用 NUL 终止符或换行符填充,并且可以直接作为参数传递。
我是re-writing你下面的代码:-
#!/bin/bash
find "" -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 "" -name "PROC????.tif" > /tmp/imagefile_list.txt
# If you list down all the .tif file use below command
# find "" -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 {} +
我正在尝试将 TIFF 图像文件的层次结构转换为 JPG,出于无聊,我想在单个文件中执行 find
和 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
仅在第一个参数块中成功调用。
问题是:如何将这样的体内命令提供给 find
命令中的每个 sh
调用?
更新
问题上的标签 "heredoc" 旨在接收不依赖于外部文件或通过 [=19=]
自引用的答案。它还旨在让任何文件名都不会经过字符串数组处理,例如用 NUL 终止符或换行符填充,并且可以直接作为参数传递。
我是re-writing你下面的代码:-
#!/bin/bash
find "" -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 "" -name "PROC????.tif" > /tmp/imagefile_list.txt
# If you list down all the .tif file use below command
# find "" -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 {} +