【问题标题】:Linux: copy one file from several directoriesLinux:从多个目录复制一个文件
【发布时间】:2012-08-27 21:01:29
【问题描述】:

我有一种情况,我想从 linux 下的数千个目录中复制一个特定文件“transaction.log”并构建一个包含这些相同特定文件的 tar 文件。

示例: 我在 /user/foo/dirs/ 下有数千个目录

/user/foo/dirs/dir1
/user/foo/dirs/dir2
/user/foo/dirs/dir3
..
..
..
/user/foo/dirs/dir50000

在每个目录中,有几个文件和一个 transaction.log 文件。我想从所有 50000 个目录中复制这个 transaction.log 文件并将它们存储在一个 tar 文件中。

如果有办法,你能帮帮我吗?

谢谢。

解决方案:

Okies,我发现了问题,因为有一些指向其他磁盘的符号链接无法正常工作。解决方案是使用 -follow 选项和 find 来跟踪符号链接。谢谢。 我使用以下命令

找到 . -follow -type f -name "transaction.log" | tar --create --files-from -> /foo/Stats_transaction_Object.tar.gz

【问题讨论】:

  • 到目前为止你做了什么?
  • 您可以使用通配符。 $ tar -cvf tarname.tar /user/foo/dirs/dir*/transaction.log

标签: linux copy tar


【解决方案1】:

带有 {} 的那个还不错,但它会为每个文件运行一个单独的 tar 进程。这是一个单独的 tar 进程,所以速度要快一些:

find /where/ever -name transaction.log -print | tar --create --files-from - > /somewhere/else/foo.tar

【讨论】:

  • -print 是默认设置,让 tar 创建存档而不是通过 shell 重定向完成可能更有效...
  • 谢谢 dstromberg。我尝试了您的建议,但创建的 tar 文件只有 7747 个包含“transaction.log”文件的目录。我有大约 50K 目录包含这个文件。我注意到 teppic 建议它是 7743 个文件。 linux做do有什么限制吗?
  • -print 是某些 find 的默认值,尤其是 GNU find。在其他查找中没有默认操作。
  • 我会尝试 find /where/ever -name transaction.log -print | wc -l
【解决方案2】:

您可以使用以下命令:

cd /user/foo/dirs/
find . -type f -name "transaction.log" | xargs tar -zcvf transaction_logs_backup.tar.gz

【讨论】:

  • 如果 transaction.log 文件列表的长度超过一个命令调用的 xargs 限制(通常为 4K),您将获得一个不完整的存档。
【解决方案3】:

假设您也想存储目录路径:

find /user/foo/dirs/ -name 'transaction.log' -exec tar rf /tmp/stuff.tar {} \;

这会将在该目录结构中找到的每个 transaction.log 文件存储在 /tmp/stuff.tar 中。

【讨论】:

  • 谢谢。我尝试了您的建议,但创建的 tar 文件只有 7743 个包含“transaction.log”文件的目录。我有大约 50K 目录包含这个文件。 linux做do有什么限制吗?
  • 好吧,我发现了这个问题,因为有一些指向其他磁盘的符号链接发现工作不正常。解决方案是使用 -follow 选项和 find 来跟踪符号链接。谢谢。
【解决方案4】:

查找 /user/foo/dirs -name transaction.log | tar -cv -T- -f /tmp/stuff.tar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2012-03-04
    • 2015-06-23
    • 2010-10-09
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多