Bash脚本用于合并目录中的文件并删除原件

时间:2015-07-24 13:37:47

标签: bash

我正在编写一个非常小的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

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。