sha*_*nus 4 scripting pipe find
如何通过 sed 将查找结果通过管道传输到流中,然后将转换后的流用作脚本的两个参数之一?IE:
find出现 file1.tiff (以及其他)
sed转换 file1.tiff --> file1.jpg
使用这两个参数执行命令:convert file1.tiff file1.jpg
我已经尝试了多种方法,但无法得到它。这是一种赋予风味的尝试:
find ./out -regex ".*_p[bg]_.*tiff" -exec echo "Processing {}" \; -exec convert {} `echo {} | sed s/tiff/jpg/` \;
Run Code Online (Sandbox Code Playgroud)
我应该放弃并编写一个 Python 脚本来分别完成这些部分,但我终于尝试学习 UNIX 工具,现在我着迷了。帮助!
我不确定你能不能在里面装一根管子-exec
。 find -exec echo {} \| sed s/tiff/jpg \;
似乎不起作用。
如果您认为最好的选择是制作一个脚本来进行转换,例如
convert_tiff_to_jpg :
#!/bin/bash
echo "Processing $1"
convert "$1" "${1/%tiff/jpg}"
Run Code Online (Sandbox Code Playgroud)
并按照find -exec
您的意图调用它:
find ./out -regex ".*_p[bg]_.*tiff" -exec convert_tiff_to_jpg {} \;
Run Code Online (Sandbox Code Playgroud)
有几种方法可以使用find -print0 | xargs -0
,但它们都很丑陋:
find ./out -regex ".*_p[bg]_.*tiff" -print0 |
while IFS= read -d $'\0' -r filename; do
echo "Processing $filename"
convert "$filename" "$(echo "$filename" | sed 's/tiff$/jpg/')"
done
Run Code Online (Sandbox Code Playgroud)
或者
find ./out -regex ".*_p[bg]_.*tiff" -print0 |
while IFS= read -d $'\0' -r filename; do
echo "Processing $filename"
convert "$filename" "${filename/%tiff/jpg}"
done
Run Code Online (Sandbox Code Playgroud)
或者
find ./out -regex ".*_p[bg]_.*tiff" -print0 |
xargs -0 -I FILE bash -c 'F="FILE"; echo "$F" "${F/%tiff/jpg}"'
Run Code Online (Sandbox Code Playgroud)
请注意,我更改s/tiff/jpg
为s/tiff$/jpg
这样,如果tiff
出现在文件名末尾以外的任何位置,则不会更改。