我想重命名
123/1/ -> 123/v1/
foo/1/ -> foo/v1/
bar/1/ -> bar/v1/
345/1/ -> 345/v1/
我已经搜索并找到了一些相关的解决方案,但不太确定在这种情况下什么是最好的。例如,
find . -wholename "*/1" -exec echo '{}' \;
成功地打印出了所有相对于.
的路径,但是{}
扩展到./foo/1/
,所以我不能从{}
移动到{}/v1
。
find . -wholename "*/1" -exec mv '{}' $(echo '{}' | sed 's/1/v1/') \;
我的想法是调用mv ./foo/1 ./foo/v1
,但显然它试图将.foo/1/
移动到它自己的子目录中。
总之,我只是想寻找一种最简单的方法来进行批量重命名。为了清楚起见,我试图将文本子目录1
移动到v1
,而不是将2
移动到v2
。
5条答案
按热度按时间gkl3eglg1#
像这样,使用perl rename(它可能与系统中已经存在的
rename
不同,使用rename --version
进行检查):当输出适合您时,删除
-n
(空运行)。(note您可以在bash上使用
globstar
或在其他shell上使用类似的方法递归到更深的子目录中)gzszwxb42#
类似这样的东西,未经测试,IMHO是最简单的方法,只要你的路径不包含换行符,使用bash内置程序和强制的POSIX实用程序:
如果您对初始测试的输出满意,请删除
echo
。kuhbmx9i3#
这是用鱼做的标签。一个用鱼壳做的解决方案:
nqwrtyyt4#
尝试
find
的-execdir
选项不是POSIX,但find
实现广泛支持它。-execdir
选项的有用信息,请参见What are the security issues and race conditions in usingfind -exec
?。-depth
选项对于支持foo/1/1/1
这样的路径以及避免在find
无法遍历新重命名的1
目录时出现警告消息都是必需的。u0sqgete5#
我会直接用巴什来做。
给定:
您可以:
结果:
如果要插入父目录,请添加一条语句来创建它们:
结果: