在Linux中对多个文件执行操作的脚本
我想创建一个脚本,可以给出3个参数:任务、填充类型、输出文件类型;它应该将任务应用于文件夹中的每个这样的文件。例如,我应该能够发出命令:在Linux中对多个文件执行操作的脚本,linux,bash,Linux,Bash,我想创建一个脚本,可以给出3个参数:任务、填充类型、输出文件类型;它应该将任务应用于文件夹中的每个这样的文件。例如,我应该能够发出命令:convert png jpg,它应该将文件夹中的所有png文件转换为jpg。我还应该能够发送带有任务的选项,并用引号括起来,例如:“convert-o myoption”png jpg 我试过: #! /bin/bash for f in *.$2 do $1 "$f" -o "${f%.$2}.$3" done 以上是否有效,或者我是否需
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
# 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
builtin
你的代码基本上是正确的,我只需要使用一些额外的引用
以及排除对不存在的文件执行操作的可能性的测试(即使这更具装饰性…)
这里是一个简短的终端会话,展示它是如何工作的
$ 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
,您就可以…使用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
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"
这可能有助于我理解你的问题,但似乎你需要使用getopt或getopts。谢谢大家的回答。我正在尝试这些,并将发布反馈。它应该是
dst=$1
,而不是$2(因为已经使用了shift)。否则,它工作得很好。
my-script png jpg convert --some-option "argument with spacees"