重命名文件和目录 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
-execdir
是POSIX的GNU查找扩展。rename
基于Perl,来自rename
软件包。在Ubuntu 18.10中测试。
重命名提前解决方法
如果您的输入路径不是来自find
,或者您已经受够了相对路径的烦恼,我们可以使用一些Perl预行来安全地重命名目录,如下所示:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
我还没有找到一个方便的模拟-execdir
与xargs
:xargs的:改变工作目录到文件的路径执行前?
的sort -r
要求,以确保文件有其各自的目录后,由于较长的路径都较短的具有相同前缀之后。
rename
或Red Hatrename
吗?