たとえば、ファイル名:
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で編集されるファイルの内容のみが表示されます。名前変更スクリプトが目的の操作を実行することに満足している場合は、オプションを削除してください(または詳細な出力に-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