【问题标题】:Files not available after running find command运行 find 命令后文件不可用
【发布时间】:2015-08-17 22:00:00
【问题描述】:

我尝试使用以下 find 命令将以“.txt”结尾的文件重命名为“.abc”。现在这些文件在我的磁盘上不可用。

find ./ -type f -iname '*.txt' -exec sh -c 'mv "$0" "$1.abc"' {} \;

谁能详细解释一下上面的命令是怎么处理这些文件的。

有没有可能找回那些,如果是的话如何?

【问题讨论】:

    标签: find exec


    【解决方案1】:

    您使用了错误的变量,并且大部分文件无法检索。

    find ./ -type f -iname '*.txt' -exec sh -c 'mv "$0" "$1.abc"' {} \;
    

    会将每个 .txt 文件重命名为名为 .abc 的文件。因此,如果您的文件名为 bar.txt 和 foo.txt,它会将 bar.txt 重命名为 .abc,然后将 foo.txt 重命名为 .abc,这将覆盖 bar.txt 的原始内容。您看不到该文件,因为它是 .abc 并且隐藏在普通列表下。如果您运行“ls -a”,您将看到一个名为“.abc”的文件,其中包含最后一个重命名的 .txt 文件的内容。

    我不知道如何做你想要的,但正在运行

    find ./ -type f -iname '*.txt' -exec sh -c 'mv "$0" "$0.abc"' {} \;
    

    会将每个 .txt 文件重命名为 .txt.abc 文件。所以你会有 bar.txt.abc 和 foo.txt.abc

    【讨论】:

      【解决方案2】:

      rondo 的解释是正确的。 但是您的问题有什么解决方案?

      如果要将后缀 .txt 替换为 .abc 可以使用 rename

      你会成功,如果你使用重命名并像这样找到:

      find . -type f -iname '*.txt' -print0 | xargs -0 rename .txt .abc
      

      对于通过 find 找到的所有文件,例如 x.txt 或 a/b.txt,将执行相应的命令,例如

      rename .txt .abc x.txt
      rename .txt .abc a/b.txt  
      

      所以 x.txt -> x.abc 和 a/b.txt -> a/b.abc

      如果您只想将后缀 .abc 添加到所有文件中,您仍然可以使用 mv

      find . -type f -iname '*.txt' -print0 | xargs -0 mv {} {}.abc
      

      使用 xargs 对每个文件执行命令 mv。

      顺便说一句:使用 find 选项“-print0”和 xargs 选项“-0”,这些命令也适用于包含空格的文件名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 2020-10-13
        相关资源
        最近更新 更多