フォルダ内のファイルを名前でグループ化

フォルダ内のファイルを名前でグループ化

たとえば、多くのファイルを含むフォルダがあります。

20_1_A.xml,
20_2_A.xml,
20_3_A.xml,
...

10_1_A.xml,
10_2_A.xml,
10_3_A.xml,
...

20_1_A.csv,
20_2_A.csv,
20_3_A.csv,
...

10_1_A.csv,
10_1_A.csv,
10_3_A.csv,
...

シェルコマンドを使用して、名前の最初の数字でファイルをグループ化したいと思います。たとえば、

  • 20というフォルダにある20で始まるすべてのファイルと、10というフォルダにある10で始まるすべてのファイル。ファイル形式は重要ではありません。

これを行う方法を知っている人はいますか?ワイルドカードを使ってみようかと思いましたが、どうしたらいいのかわかりません...

答え1

ワイルドカードが適したツールです。次のようにすべてのファイルを移動できます。

for i in {10,20} # or something like $(seq 10 10 90) instead of {10,20} if you have a lot of different prefixes
do
    mkdir -p "$i" &&
      mv "$i"* "$i"/
done

ターゲットディレクトリがすでに存在する場合は、mkdir -pそれを文句を言わないようにします。mkdir

答え2

for datei in *_*.xml *_*.csv; 
 do mkdir -p -- "${datei%%_*}" && 
    mv -- "$datei" "${datei%%_*}"
 done

パターンに一致するファイルごとに、最初の下線(-pまたはまだ存在しない場合はオプション)の前の部分として名前付きディレクトリを作成し、そのディレクトリにファイルを移動します。

これが適していることを願っています。

答え3

そしてzsh

mkdir_and_move() {mkdir -p -- $2:h && mv -- "$@"}
autoload zmv

zmv -P mkdir_and_move '(<->)*.(csv|xml)(#q.)' '$1/$f'

<->は、任意の10進数(〜までの整数)と一致するglobです<x-y>。一般ファイルのみを選択するglob修飾子です。xy(#q.)

ループを使用して行うことと似ていますが、追加の完全なzmv健全性チェックだけが必要です。

関連情報