在Linux中执行多个文件的脚本

我想创build一个脚本,可以给3个参数:任务,infile型,outfile型; 它应该将任务应用到文件夹中的每个这样的文件。 例如,我应该能够给出命令: convert png jpg ,并且它应该将所有png文件转换为jpg文件夹中。 我也应该能够发送带有任务的选项,用引号括起来,例如: "convert -o myoption" png jpg

我试过了:

 #! /bin/bash for f in *.$2 do $1 "$f" -o "${f%.$2}.$3" done 

上面的工作,还是我需要附加$ 1等{}或[]? 我没有尝试过,如果错误的话,可能会导致不可预知的文件损坏。 谢谢你的帮助。

将该命令移动到参数列表的末尾。

 #! /bin/bash src=$1; shift dst=$1; shift for f in *."$src" do "$@" "$f" -s -o "${f%.$src}.$dst" done 

然后参数得到正确的引用

 my-script png jpg convert -o myoption 

甚至,如果参数包含空格。

 my-script png jpg convert --some-option "argument with spacees" 

你可以用GNU Parallel很容易的表达出来,并且还可以并行运行所有的任务:

 parallel convert {} {.}.png ::: *.jpg 

{}代替参数, {.}代表没有扩展名的参数。

至于你担心做一些有潜在危险的事情,可以用--dry-run来测试它会做什么,而不用做任何事情:

 parallel --dry-run convert -o XYZ {} {.}.png ::: *.jpg 

示例输出

 convert -o XYZ a.jpg a.png convert -o XYZ a\ g.jpg a\ g.png convert -o XYZ b.jpg b.png 

我想你想在你的文件夹中有一个文件列表。 你可以试试。 让我现在如果有一些错误,所以我可以改变它到你真正想要的

 #! /bin/bash # Command which should performed echo $1 # File type IN echo $2 # File type OUT echo $3 for i in $(ls) do $1 $2 $3 $i done 

在编写可能会产生危险结果的shell脚本时,一个有用的技术就是使用echo内建。

你的代码基本上是正确的,我只是使用一些额外的引用和测试排除对现有文件的行动的可能性(即使这是更美观…)

 repeat() { for f in *.$2 ; do [ -f "$f" ] && echo $1 \"$f\" \"${f%.$2}.$3\" done ; } 

这里是一个简短的终端会话,以显示它是如何工作的

 $ ls a b.png a.png b.png $ repeat() { for f in *.$2 ; do [ -f "$f" ] && echo $1 \"$f\" \"${f%.$2}.$3\" ; done ; } $ repeat 'cp -f' pmg jpg #### typinh error $ repeat 'cp -f' png jpg cp -f "a b.png" "a b.jpg" cp -f "a.png" "a.jpg" cp -f "b.png" "b.jpg" $ repeat 'cp -f' png jpg | sh $ ls a b.jpg a b.png a.jpg a.png b.jpg b.png $ 

当你99.9%的代码确定,删除echo ,你在那里…