【问题标题】:Archive old files to different files将旧文件归档到不同的文件
【发布时间】:2014-05-12 02:05:07
【问题描述】:

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

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

【问题讨论】:

  • 您的意思是要归档每个目录,其归档名称与被归档目录的名称相似。
  • @Vivek 我想将每个文件存档在不同的目录中,并且需要一个输出存档文件用于一个输入文件。
  • 为什么不使用 tar 的 -r 选项将每个目录附加到 tar 文件中。然后,您可以为每个要添加的目录运行一次命令。
  • 你考虑过logrotate吗?
  • @Basilevs 抱歉不熟悉 logrotate

标签: bash shell unix


【解决方案1】:

用途:

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 都将替换为其值,即文件路径。

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

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

这是我们想要的。这将发生在每个文件路径上。

【讨论】:

  • 你能解释一下这会有所帮助吗。
【解决方案2】:

这个 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。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多