たとえば、多くのファイルを含むフォルダがあります。
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修飾子です。x
y
(#q.)
ループを使用して行うことと似ていますが、追加の完全なzmv
健全性チェックだけが必要です。