如何递归地从文件名中删除所有连字符

如何递归地从文件名中删除所有连字符

我有很多文件夹,里面有 1 个文件,需要批量重命名才能删除它

-(样本)

所以

文件名-(样本).mp3

变成

文件名.mp3

他们的父文件夹有(样本)最后我也可以删除(样本)通过运行以下命令在文件夹上:

find . -name '*\(sample)*' | while read f; do mv "$f" "${f//\(sample)/}"; done

当我第二次再次运行它时,它会从包含的文件名中删除(样本)(但在第一次运行时不会。)

所以我只剩下

文件名-.mp3

将连字符添加到我输入的代码中,如下所示

'*\-(sample)*'

不起作用。

我一整天都在网上尝试了很多其他方法,但没有任何效果,服务器无法识别某些命令,例如“重命名”。

我试图避免下载几千个这样的示例文件来在本地更改文件名,这是我可以做的。

服务器运行的是 Debian。

但我不知道,也许会离开-.mp3会好吗?看起来有点草率和奇怪?我读过在文件名开头留下连字符可能会导致问题,所以另一端可能相同吗?

我可以很好地遵循说明(并且总是会首先研究答案以更好地理解),但我不是专家,所以请记住这一点。

如果有人有任何其他建议那就太好了。我可以从文件夹/文件名中删除任何我想要的内容,除了连字符。

谢谢!

答案1

首先,从最低(最深)的匹配开始find- 否则您可能会重命名父目录,并且以下重命名可能会失败,因为您不再在那里找到子目录和文件。第二个rename是(恕我直言)更简单的工具。第三直接通过执行find

find -depth -name '*-(sample)*' -exec rename --nopath 's:-\(sample\)::' '{}' +

如果您想先测试,请用作-n选项rename- 它将进行试运行并显示更改。需要该--nopath选项以确保您不会首先重命名前面的目录。

相关内容