ファイルをアルファベットと数値フォルダーにソートする Bash スクリプト (8 文字目でソート文字オフセット)

ファイルをアルファベットと数値フォルダーにソートする Bash スクリプト (8 文字目でソート文字オフセット)

たとえば、ファイル名: 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,18番目の文字を表します。
  • 空でない場合$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

おすすめ記事