例如文件名:
9323 - Unix.ext
或z223 - 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
命令(也称为prename
和file-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