我的父目录(/home/anik/“所有我的目录”)中有 100 个目录,具有以下命名结构:
- Zt.isolate1.黑桃
- Zt.isolate2.Spades
- Zt.isolate100.Spades
我想去掉“Zt”。以及每个目录名称中的“.Spades”部分。
您能告诉我如何一次循环地对所有目录执行此操作吗?谢谢。
答案1
循环名称并使用变量替换来删除不需要的位。以下假设这$HOME
是/home/anik
您的文件所在的位置(topdir
如果文件位于其他位置,请更改为其他值):
#!/bin/sh
topdir=$HOME
for dirpath in "$topdir"/Zt.*.Spades; do
[ ! -d "$dirpath" ] && continue
newdirpath=$topdir/${dirpath#$topdir/Zt.}
newdirpath=${newdirpath%.Spades}
if [ -e "$newdirpath" ]; then
printf 'Can not rename "%s" into "%s", name taken\n' "$dirpath" "$newdirpath"
else
printf 'Renaming "%s" into "%s"\n' "$dirpath" "$newdirpath"
echo mv "$dirpath" "$newdirpath"
fi
done
该表达式$topdir/${dirpath#$topdir/Zt.}
将替换为目录的路径名,但Zt.
目录文件名的开头不带 。它通过删除前缀$topdir/Zt.
然后$topdir/
在开头再次添加来实现此目的。
该表达式${newdirpath%.Spades}
扩展为但会从值的末尾$newdirpath
删除字符串。.Spades
echo
我在命令前面添加了mv
输出将要执行的命令而不是执行它。测试代码,echo
如果看起来正确,则删除。
答案2
您可以使用 Perlrename
工具:
rename -n 's/Zt\.(.+?)\.Spades$/$1/' /home/anik/Zt.*.Spades
(-n
如果您对输出满意,请删除以实际重命名)
查看这选择正确的rename
工具。