我正在编写一个非常小的bash脚本来合并目录中的一些文件。
假设我有一个充满文件的目录:
deb_1
deb_2
deb_3
deb_4
...
我想写一个小的bash脚本将它们全部合并到一个文件中,然后删除原件
所以我会运行mrg deb* outputfile
,结果目录如下:
outputfile
包含合并的所有deb文件。我的方式通常是cat deb* > outputfile && rm deb* -f
然而,尝试将其转换为bash脚本并不是很有效:
#!bin/bash
cat $1 > $2 && rm $1 -f
通配符扩展取代$1-> deb_1,$2-> deb_2
答案 0 :(得分:4)
保持脚本不变:
#!bin/bash
cat $1 > $2 && rm $1 -f
但在调用它时将单引号应用于第一个参数:
bash myscript.sh 'deb*' outputfile
答案 1 :(得分:1)
沿着@Eugeniu在评论中提到的那句话,如
$ myscript outputfile files*
鉴于myscript
的以下定义:,是可能的
#!/bin/bash
OUTPUT="$1";shift
cat "$@" > "$OUTPUT" && rm "$@" -f
$@
是所有命令行参数的列表,"$@"
是单独引用的命令行参数列表:"deb01" "deb02" "deb03"
。shift
用于从参数列表中删除输出文件,以便它不会出现在$@
的扩展中。cat
将文件连接到您的输出文件rm
删除原件。命令的一般形式为:
myscript OUTPUT [INPUT_FILE]...
在您的情况下,您需要将其称为
$ myscript outputfile deb_{1..4}/*
将每个目录中的每个文件作为命令行参数抓取到myscript
可能使用最后一个参数作为输出文件(使用$#
),但需要更多工作才能从$@
删除最后一个参数。
一种简单的方法可以解决这个问题 - 对脚本进行明显的修改以使用stdout - 将是:
$ myscript input files... > outputfile
由于shell在运行命令之前应用重定向(截断并打开outputfile
),rm
仍然是安全的,与现在完全相同 - 这是有问题的,IMO。