在Linux中以递归方式重命名文件(更改扩展名)


22

如何递归重命名目录中的所有文件,以将数千个子文件夹中的数千个文件扩展名更改为另一个文件扩展名?我看到很多命令几乎可以完成我想要的,但不完全是我想要的。

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile

1
您有Debian rename或Red Hat rename吗?
伊格纳西奥·巴斯克斯

@Ignacio:Ubuntu = Debian?
endlith 2010年

是的,Ubuntu是Debian的衍生产品。
伊格纳西奥·巴斯克斯

Answers:


23

弄清楚了

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile

当然在实际执行操作时删除-v,否则将浪费时间显示所有文件


14

就像是:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;

这个最适合我
-cwd


4

我发现此方法更容易阅读:

find . -name "*.andnav" | rename "s/\.andnav$/.tile/"

至少在Ubuntu派生版本中,如果命令行中没有文件,则重命名会从STDIN中获取文件列表。可以使用以下方法轻松测试:

find . -name "*.andnav" | rename -vn "s/\.andnav$/.tile/"

直到正确为止。


1

重命名文件和目录 find -execdir | rename

如果您不只是使用后缀来重命名文件和目录,那么这是一个很好的模式:

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find . -depth -execdir rename 's/findme/replaceme/' '{}' \;

与相比,真棒-execdir选项cd在执行rename命令之前会对目录执行a 操作-exec

-depth 确保重命名首先在孩子上进行,然后在父母上进行,以防止丢失父目录的潜在问题。

-execdir 由于重命名在非基本名称的输入路径中不能很好地发挥作用,因此是必需的,例如以下操作失败:

rename 's/findme/replaceme/g' acc/acc

PATH需要的黑客,因为-execdir有一个很讨厌的缺点:find极其固执己见,拒绝做任何事情-execdir,如果您有任何相对路径在您的PATH环境变量,例如./node_modules/.bin,与失败:

find:相对路径'./node_modules/.bin'包含在PATH环境变量中,与find的-execdir操作结合使用时,它是不安全的。请从$ PATH中删除该条目

另请参阅:https : //askubuntu.com/questions/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378

-execdirPOSIX的GNU查找扩展rename基于Perl,来自rename软件包。在Ubuntu 18.10中测试。

重命名提前解决方法

如果您的输入路径不是来自find,或者您已经受够了相对路径的烦恼,我们可以使用一些Perl预行来安全地重命名目录,如下所示:

git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'

我还没有找到一个方便的模拟-execdirxargsxargs的:改变工作目录到文件的路径执行前?

sort -r要求,以确保文件有其各自的目录后,由于较长的路径都较短的具有相同前缀之后。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.