使用单个bash命令批量重命名文件夹

约书亚

我有这样的文件夹设置:

/path/to/directory/SLUG_1/SLUG_1 - SLUG_2 - SLUG_3

SLUG_2是一年,该年之后可能会有一个字母,例如“ 1994”或“ 2003a”。

我想将这些文件重命名为:

/path/to/directory/SLUG_1/SLUG_2 - SLUG_3

我使用以下命令已经很接近了:

find $root -mindepth 2 -maxdeth 2 -type d | sed "s#\(\(/path/to/directory/[^/]*/\).* - \([0-9]\{4\}[a-bA-B]\? - .*\)\)#mv "\1" "\2\3"#

打印:

mv "/path/to/directory/SLUG_1/SLUG_1 - SLUG_2 - SLUG_3" "/path/to/directory/SLUG_1/SLUG_2 - SLUG_3"

正是我要执行的命令。但是我不能执行它。

我尝试将输出分配给变量,然后通过调用变量来执行它。那没用。我对该想法进行了一些尝试,但出现了错误。

感觉好像我在这里缺少一些工具。一些迭代工具使这项工作变得容易。有什么建议?

通配符

另一个答案,使用GNUfind来处理重命名。无论文件名中可能包含什么字符,此方法都非常可靠。

如果我正确地理解了您的用例,那么您想重命名以其父目录的全名开头的目录。换句话说,如果您的目录这样命名:

/some/path/abcdefghi/abcdefghi - something - else/

您想这样重命名:

/some/path/abcdefghi/something - else/

由于您在此问题上将GNU指定为标记,因此可以对find命令使用GNU扩展,并按以下方式进行处理:

find . -mindepth 2 -maxdepth 2 -type d -regextype posix-egrep -regex '.*/([^/]+)/\1[^/]+' -exec sh -c 'new="$(sed -r "s:/([^/]+)/\\1 ?-? ?([^/]+)\$:/\\1/\\2:" <<<$1)"; mv "$1" "$new"' find-sh {} \;

检测结果:

[vagrant@localhost test]$ mkdir -p SLUG_1/SLUG_{1\ -\ SLUG_{2..4}\ -\ SLUG_5,7\ -\ something}
[vagrant@localhost test]$ find . -type d
.
./SLUG_1
./SLUG_1/SLUG_1 - SLUG_2 - SLUG_5
./SLUG_1/SLUG_1 - SLUG_4 - SLUG_5
./SLUG_1/SLUG_1 - SLUG_3 - SLUG_5
./SLUG_1/SLUG_7 - something
[vagrant@localhost test]$ find . -mindepth 2 -maxdepth 2 -type d -regextype posix-egrep -regex '.*/([^/]+)/\1[^/]+' -exec sh -c 'new="$(sed -r "s:/([^/]+)/\\1 ?-? ?([^/]+)\$:/\\1/\\2:" <<<$1)"; mv "$1" "$new"' find-sh {} \;
[vagrant@localhost test]$ find . -type d
.
./SLUG_1
./SLUG_1/SLUG_3 - SLUG_5
./SLUG_1/SLUG_4 - SLUG_5
./SLUG_1/SLUG_2 - SLUG_5
./SLUG_1/SLUG_7 - something
[vagrant@localhost test]$ 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章