Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux中对多个文件执行操作的脚本_Linux_Bash - Fatal编程技术网

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

在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 以上是否有效,或者我是否需

我想创建一个脚本,可以给出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

以上是否有效,或者我是否需要在{}或[]中附上$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"