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

时间:2017-05-11 06:04:09

标签: linux bash

我想创建一个可以给出3个参数的脚本:task,infile-type,outfile-type;它应该将任务应用于文件夹中的每个这样的文件。例如,我应该能够发出命令: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等?我没有尝试过,因为如果错误,可能会对文件造成不可预测的损坏。谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

您可以使用 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

答案 1 :(得分:1)

我想你想要在你的文件夹中有一个文件列表。你可以尝试一下。现在让我,如果有一些错误,我可以将它改为你想要的

#! /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

答案 2 :(得分:1)

编写可能带来危险结果的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并在那里......

答案 3 :(得分: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"