我正在尝试使用命令替换来制作 tar.tgz 文件
有2012年8月17日的备份
-rw-r----- 1 ossec 502 804M Aug 17 2012 BKPMDISINT_i6nir20j.F_bkp
-rw-r----- 1 ossec 502 2.7G Aug 17 2012 BKPSYFINT_i5nir20j.F_bkp
-rw-r----- 1 ossec 502 3.9G Aug 17 2012 BKPMSFFINT_i4nir20j.F_bkp
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-00
-rw-r----- 1 ossec 502 2.0G Aug 17 2012 ALG_KLPFINT_ianir576.alg
-rw-r----- 1 ossec 502 1.5G Aug 17 2012 ALG_KLPFINT_i8nir576.alg
-rw-r----- 1 ossec 502 37M Aug 17 2012 ALG_KLPINT_ibnir64h.alg
-rw-r----- 1 ossec 502 2.2G Aug 17 2012 ALG_KLPFINT_i9nir576.alg
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-01
-rw-r----- 1 ossec 502 27M Aug 17 2012 ctrl_170803
所以我需要焦油它们。我用了这个命令
tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "8 月 17 日")
但这给了我这个错误
tar: You may not specify more than one `-Acdtrux' option
Try `tar --help' or `tar --usage' for more information.
答案1
如果这样做,$(ls -lrth|grep "Aug 17")
您将得到整行,而不仅仅是文件名作为 的参数tar
,因此这是行不通的。一般来说你应该不解析的输出ls
。
如果您有相对较新版本的 Gnu find (>= v4.3.3 ),您可以执行以下操作:
find . -maxdepth 1 -newermt 20120817T0000 -not -newermt 20130818T0000 -print0 \
| cpio --create --null --format=ustar \
| gzip > DB-Backup-17082012.tgz
如果您find
不支持,-newermt
您可以创建两个带有这些日期时间戳的文件,然后使用 -newer。当然你也可以使用,-daystart -mtime
但你需要计算天数(或使用试错法)。
我的一项建议是在文件中使用 YYYYMMDD 形式的日期。首先,如果您有多个以相同字符串开头的文件(截至日期),则排序会更好;其次,根据查看文件名的人(6 月 5 日(欧洲)或 5 月 6 日(美国)),像 05062012 这样的内容会不明确。 。因此,虽然 1708 必须是 8 月 17 日,但我会将该文件称为DB-Backup-20120817.tgz
答案2
你的方式
您当然可以做您想做的事情,但这可能很危险,因为某些文件的名称中可能包含空格。不过,这是一种方法。
$ tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17"|awk '{print $9}')
这将删除您从中获取的所有其他列数据,ls -lrth
只为您提供文件名。
使用 find & tar:方法 #1
您可以使用 Unixfind
命令获取在给定日期最后修改的所有文件的列表,并将该列表通过管道传输到tar
如下:
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 -print0 | \
xargs -0 tar zcvf DB-Backup-17082012.tgz
上面的命令只会找到最后修改时间为 2012 年 8 月 17 日的文件,但不会找到较新的文件。告诉find 使用空字符 ( )-print0
分割输出的文件,并获取每个文件并构建一次批量添加文件的调用。\0
xargs -0
tar
这可能是执行此操作的性能最低的方法。
笔记:tar
如果您的文件数量超过了可以作为命令行参数传递给命令的文件数量,则此方法还存在丢失文件的风险。
使用 find & tar:方法 #2
和-print0
是xargs -0
多余的,您可以仅使用它find
来生成列表并tar
直接调用:
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 \
-exec tar zcvf DB-Backup-17082012.tgz {} \+
{} \+
上述 find 的参数将执行 2 项操作。将在调用时替换在此位置找到的{}
每个文件的名称,并指示在调用之前继续在命令行上添加尽可能多的文件。 如果您有 100 个文件要添加到命令行中,这将节省您调用100 次的时间。find
tar
\+
find
tar
tar
参考
答案3
您当前的格式ls|grep "Aug 17"
不会输出任何内容。相反,请使用以下格式:
$ ls -ltr | grep 'Aug 17'
答案4
关于$(ls -lrth|grep "Aug 17")
此 awk 行可能会提取您想要的日期:
$(ls -lrth|awk '/Aug/&&/17{print $0}')