我正在尝试重命名几个目录,在第四个和第六个字符后添加破折号。我看了这个帖子如何在 bash 中仅循环目录?并能够成功循环遍历我希望插入破折号的目录。然而看到这个之后重命名文件在第四个和第六个字符后添加破折号我虽然也许可以在目录上使用类似的语法,但这样做后意识到不能那样做。这是我的语法:
for d in */ ; do
mv “$d" “${d::4}-${d:4:2}-${d:6}"
done
我搜遍了SE,没有看到类似的帖子。如果这个问题在其他地方得到回答,我提前表示歉意。
另外,预先感谢您提供的任何帮助。最好的,乔恩
答案1
使用珀尔的rename
重命名所有目录:
rename -n 's/^(.{4})(.{2})/${1}-${2}-/' */
-n
当您的测试令人满意时,将其移除。
前任:
$ mkdir foobarbase{a..c}
$ rename -n 's/(.{4}) # 1st capture group
(.{2}) # 2nd capture group
/${1}-${2}-/x' foobar*
rename(foobarbasea, foob-ar-basea)
rename(foobarbaseb, foob-ar-baseb)
rename(foobarbasec, foob-ar-basec)
如果你想保留你的代码,请“
用 ascii 双引号替换:"
答案2
我将“
字符更改为"
:
for d in */ ; do
mv "$d" "${d::4}-${d:4:2}-${d:6}"
done
我的目录的
#ls
fooobar1 fooobar2 fooobar4 fooobar6 fooobar8
fooobar10 fooobar3 fooobar5 fooobar7 fooobar9
和运行后
#ls
fooo-ba-r10 fooo-ba-r3 fooo-ba-r5 fooo-ba-r7 fooo-ba-r9
fooo-ba-r1 fooo-ba-r2 fooo-ba-r4 fooo-ba-r6 fooo-ba-r8
find * -maxdepth 0 -type d | while read d
do
mv "$d" "${d::4}-${d:4:2}-${d:6}"
done