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
命令说明
awesome-execdir
选项cd
在执行命令之前进入目录rename
,不像-exec
.
-depth
确保重命名首先发生在孩子身上,然后是父母身上,以防止缺少父目录的潜在问题。
-execdir
是必需的,因为 rename 不能很好地与非基本名称输入路径一起使用,例如以下失败:
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 find扩展。rename
是基于 Perl 的,来自rename
包。
重命名前瞻解决方法
如果您的输入路径不是来自find
,或者如果您已经受够了相对路径的烦恼,我们可以使用一些 Perl 前瞻来安全地重命名目录,如下所示:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
我还没有找到一个方便的类比-execdir
:xargs
https: //superuser.com/questions/893890/xargs-change-working-directory-to-file-path-before-executing/915686
sort -r
需要确保文件位于其各自目录之后,因为较长的路径位于具有相同前缀的较短路径之后。
在 Ubuntu 18.10 中测试。