将旧文件存档到不同的文件

时间:2014-05-12 02:05:08

标签: bash shell unix

过去我使用以下命令将旧文件存档到一个文件

find . -mtime -1 | xargs tar -cvzf archive.tar

现在假设我们有20个目录需要制作一个进入每个目录的脚本,并将所有文件存档到与原始文件同名的不同文件中?

假设我在一个名为/ Home / basic /的目录中有以下文件 此目录包含以下文件:

first_file.txt
second_file.txt
third_file.txt

现在我运行完脚本后,我需要输出如下:

first_file_05112014.tar
second_file_05112014.tar
third_file_05112014.tar

2 个答案:

答案 0 :(得分:2)

使用:

find . -type f -mtime -1 | xargs -I file tar -cvzf file.tar.gz file

我添加了.gz以表明它已压缩。

来自man xargs

 -I replace-str
     Replace occurrences of replace-str in the initial-arguments with names
     read from standard input.  Also, unquoted blanks do not terminate input
     items; instead the separator is the newline character.  Implies -x and -L 1.

find命令将生成文件路径列表。 -L 1表示每一行都将作为命令的输入。

-I file会将文件路径分配给file,然后tar命令行中每次出现的file都将被其值替换,即文件路径。

因此,对于ex,如果find生成文件路径./somedir/abc.txt,则相应的tar命令将如下所示:

tar -czvf ./somedir/abc.txt.tar.gz ./somedir/abc.txt

这是所希望的。这将发生在每个文件路径上。

答案 1 :(得分:1)

这个shell脚本怎么样?

#!/bin/sh

mkdir /tmp/junk  #Easy for me to clean up!
for p in `find . -mtime -1 -type f`
do
    dir=`dirname "$p"` 
    file=`basename "$p"`
    tar cvf /tmp/junk/${file}.tar $p
done

它使用basename命令提取文件名,使用dirname命令提取目录名。我实际上并没有使用该目录,但我把它留在那里以防你觉得它很方便。

我将所有tar文件放在一个地方,这样我就可以轻松删除它们,但是如果你想在同一个目录中使用它们,你可以轻松替换$ P而不是$ file。