我想将一组文件重命名为相同的文件名,但不带扩展名。它们分散在我的主目录中,我不知道它们的确切位置,但我确实知道要删除的扩展名。
我需要一个且只有一个命令来执行这项任务。
这是部分命令:
$ find ~/ -type f -name "*.hhs" -exec mv {} <I DO NOT KNOW> \;
哪里<I DO NOT KNOW>
可以替换为您的建议。例如,我尝试将其替换为以下内容:
`basename {} .hhs`
它对我不起作用。
例子
如果找到文件file1.jpg.hhs
和file2.jpg.hhs
,我希望将它们重命名如下:file1.jpg
和file2.jpg
答案1
如果您拥有或可以安装 PERL 扩展rename
(apt-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
。
有关的: