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
サポートされていないバージョンでtr
はsed
...を代わりに使用して自由に変換できます。
答え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}/*