如何修剪多个目录名称的特定部分?

如何修剪多个目录名称的特定部分?

我的父目录(/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工具。

相关内容