使用 find 命令将文件重命名为不带扩展名的相同文件名

使用 find 命令将文件重命名为不带扩展名的相同文件名

我想将一组文件重命名为相同的文件名,但不带扩展名。它们分散在我的主目录中,我不知道它们的确切位置,但我确实知道要删除的扩展名。

我需要一个且只有一个命令来执行这项任务。

这是部分命令:

$ find ~/ -type f -name "*.hhs" -exec mv {} <I DO NOT KNOW> \;

哪里<I DO NOT KNOW>可以替换为您的建议。例如,我尝试将其替换为以下内容:

`basename {} .hhs`

它对我不起作用。


例子

如果找到文件file1.jpg.hhsfile2.jpg.hhs,我希望将它们重命名如下:file1.jpgfile2.jpg

答案1

如果您拥有或可以安装 PERL 扩展renameapt-get install rename在基于 Debian 的发行版上)...

find ~ -type f -name "*.hhs" -exec rename -d ".hhs" {} +

该选项-d--delete删除指定的字符串。

答案2

您需要一个可以.hhs从文件名中删除文件名后缀的工具。 find无法为您执行此操作,因此您必须通过以下方式调用另一个实用程序-exec

find "$HOME" -type f -name '*.hhs' -exec sh -c '
    for pathname do
        cp -i "$pathname" "${pathname%.hhs}"
    done' sh {} +

我没有basename在这里使用,因为这也会从找到的路径名中删除目录路径(可以使用 再次插入dirname,但会产生混乱的代码)。

相反,我使用尽可能多的找到的路径名调用内联 shell 脚本,并让脚本循环遍历这些路径名,复制各个文件。新名称是使用标准参数替换构造的,该.hhs替换从 值的末尾删除字符串$pathname

有关的:

相关内容