将文件排序到字母和数字文件夹的 Bash 脚本(将排序字母偏移到第 8 个字符)

将文件排序到字母和数字文件夹的 Bash 脚本(将排序字母偏移到第 8 个字符)

例如文件名: 9323 - Unix.extz223 - 50 Cent.ext

我想知道如何将当前目录中的所有文件排序为 ./A 和 ./B 等以及 ./Numbers 但使用文件名中的第 8 个字符作为比较变量。

“U”和“5”将是上面示例中排序依据的变量。

谢谢

答案1

rename  -n 'if (-f $_) {
   my $c=substr($_,7,1);
   if ($c) {
     mkdir $c unless (-d $c);
     $_="$c/$_" if (-d $c);
   };
}' *.ext

这使用了珀尔 rename 命令(也称为prenamefile-rename),不是与具有完全不同且不兼容的命令行选项的rename命令相混淆。util-linux

该脚本迭代命令行上的所有文件(或从 STDIN 读取),如果当前文件是常规文件(即不是目录、命名管道、套接字等),则它:

  • 使用该函数将第 8 个字符提取substr()到变量 $c 中。 substr 偏移量从 0 开始,因此,7,1指的是第 8 个字符。
  • 如果$c不为空(短文件名会发生这种情况),则:
    • $c如果目录不存在则创建该目录。
    • 如果当前文件是目录,则将其重命名为该目录(即,如果$c已存在但不是目录,则不会中断)

或者,脚本可以将文件移动到名为的目录中,例如,Misc如果 $c 为空:

rename -n 'if (-f $_) {
   my $c=substr($_,7,1);
   $c="Misc" unless ($c);
   mkdir $c unless (-d $c);
   $_="$c/$_" if (-d $c);
}' *.ext

注意:上面的两个例子都使用了rename试运行选项 ( -n)。如果您允许,它们只会显示文件将被重命名/MV-ed 的内容。当您对重命名脚本将执行您想要的操作感到满意时,请删除该-n选项(或将其替换-v为详细输出)。

例如

$ rename -v  'if (-f $_) { my $c=substr($_,7,1);  $c="Misc" unless ($c) ; mkdir $c unless (-d $c); $_="$c/$_" if (-d $c)}'  *
9323 - Unix.ext renamed as U/9323 - Unix.ext
foo.ext renamed as Misc/foo.ext
z223 - 50 Cent.ext renamed as 5/z223 - 50 Cent.ext

相关内容