【发布时间】:2015-08-17 22:00:00
【问题描述】:
我尝试使用以下 find 命令将以“.txt”结尾的文件重命名为“.abc”。现在这些文件在我的磁盘上不可用。
find ./ -type f -iname '*.txt' -exec sh -c 'mv "$0" "$1.abc"' {} \;
谁能详细解释一下上面的命令是怎么处理这些文件的。
有没有可能找回那些,如果是的话如何?
【问题讨论】:
我尝试使用以下 find 命令将以“.txt”结尾的文件重命名为“.abc”。现在这些文件在我的磁盘上不可用。
find ./ -type f -iname '*.txt' -exec sh -c 'mv "$0" "$1.abc"' {} \;
谁能详细解释一下上面的命令是怎么处理这些文件的。
有没有可能找回那些,如果是的话如何?
【问题讨论】:
您使用了错误的变量,并且大部分文件无法检索。
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
【讨论】:
rondo 的解释是正确的。 但是您的问题有什么解决方案?
你会成功,如果你使用重命名并像这样找到:
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
find . -type f -iname '*.txt' -print0 | xargs -0 mv {} {}.abc
使用 xargs 对每个文件执行命令 mv。
顺便说一句:使用 find 选项“-print0”和 xargs 选项“-0”,这些命令也适用于包含空格的文件名。
【讨论】: