find -execdir rename
https://stackoverflow.com/a/16541670/895245仅直接适用于后缀,但这将适用于基名上的任意正则表达式替换:
PATH=/usr/bin find . -depth -execdir rename 's/_dbg.txt$/_.txt' '{}' \;
或仅影响文件:
PATH=/usr/bin find . -type f -execdir rename 's/_dbg.txt$/_.txt' '{}' \;
-execdir
首先cd
进入目录,然后仅对基本名称执行。
在Ubuntu 20.04上测试,找到4.7.0,重命名1.10。
方便,安全的助手
find-rename-regex() (
set -eu
find_and_replace="$1"
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename "${2:--n}" "s/${find_and_replace}" '{}' \;
)
GitHub上游。
用连字符'-'替换空格''的示例用法。
试运行,显示无需实际操作即可将其重命名为以下内容:
find-rename-regex ' /-/g'
执行替换:
find-rename-regex ' /-/g' -v
命令说明
与相比,真棒-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
软件包。
重命名提前解决方法
如果您的输入路径不是来自find
,或者您已经受够了相对路径的烦恼,我们可以使用一些Perl预行来安全地重命名目录,如下所示:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
我还没有找到一个方便的模拟为-execdir
具有xargs
:/superuser/893890/xargs-change-working-directory-to-file-path-before-executing/915686
的sort -r
要求,以确保文件有其各自的目录后,由于较长的路径都较短的具有相同前缀之后。
在Ubuntu 18.10中测试。
Bareword "..." not allowed while "strict subs" in use at (eval 1) line 1.