2つのディレクトリ間でファイルを移動するシェルスクリプト

2つのディレクトリ間でファイルを移動するシェルスクリプト

JAN / Jan / FEB / Feb / MAR / Mar /などのサブフォルダーを含む複数のフォルダーがあります。すべてのファイルをJAN / *からJan /に、FEB / *からFeb /に移動する必要があります。シェルスクリプトを使用してこれを達成するにはどうすればよいですか?

編集する
正しい方向を教えてくれた@Costasに感謝します。彼の解決策はBash 4以降で動作します。私はv3を持っているのでこれを使うようになりました。

for DIR in [A-Z][A-Z]*/
do
    NEWDIR=`echo "$(echo "$DIR" | sed 's/.*/\L&/; s/[a-z]*/\u&/g')"`
    mv $DIR/* $NEWDIR
done

sedスクリプトから取得ここ

答え1

最新の場合bash(大文字と小文字の変更をサポート):

for dir in [A-Z][a-z]*/
do
    mv -t "$dir" ${dir^^}/*
done

サポートされていないバージョンでtrsed...を代わりに使用して自由に変換できます。

答え2

Perlベースのrenameユーティリティ(Debianでは標準で利用可能ですが、prename他のシステムではこのユーティリティとも呼ばれます)を使用すると、単一のコマンドでこれを実行できます。

( LC_ALL=C; prename -v 's!^([A-Z])([A-Z]{2}/)!$1\L$2!' [A-Z][A-Z][A-Z]/* )

これにより、Cロケールでファイル名の一致が大文字と小文字を区別し、ファイルパターンが[A-Z][A-Z][A-Z]すべて大文字の月のみを選択できるようになります。この置換は、3つの大文字を1つの大文字と2つの小文字に置き換えます。

必要に応じて、ファイル名パターンを[A-Z][A-Z][A-Z]/*12ヶ月間の明示的なリストに置き換えることができます。{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}/*

関連情報