
次のような名前のファイルのシーケンスが 1000 個あります。
file01-01-01, file01-01-02 etc.
file01-02-01, file01-02-02 etc.
file02-01-01, file02-02-02 etc.
ファイルを次の名前のフォルダに分類したいと思います。
dir01-01 (containing files01-01*)
dir01-02 (containing files01-01*)
dir02-01 (containing files02-01*)
次のような行を使用することで、これを行うのにかかる時間を短縮できることがわかっています。
mkdir dir01-01; for f in file01-01*; mv "$f" dir01-01; done
しかし、上記ではソート時間がわずかに短縮されるだけです。ソート操作全体を自動化するにはどうすればよいでしょうか?
let N ++ を使って何かする必要があることはわかっていますが、それをどのように組み込むかがわかりません。
答え1
これで動作するはずです。まず、次のようなテスト ファイルを作成しました。
touch file01-01-01 file01-01-02 file01-02-01 file01-02-02 file02-01-01 file02-02-02
を使用してそれらが存在することを確認しました。ls -1
出力は次のようになりました。
file01-01-01
file01-01-02
file01-02-01
file01-02-02
file02-01-01
file02-02-02
次に、これらのファイルを含むディレクトリ内で次の Bash スクリプトを実行しました。
find . -type f |\
while read FULL_FILE_PATH
do
FIRST_TWO_DIGITS=$(echo "${FULL_FILE_PATH}" | grep -Eo '[[:digit:]]{2}-[[:digit:]]{2}');
if [ ! -z "$FIRST_TWO_DIGITS" -a "$FIRST_TWO_DIGITS" != " " ]; then
DIR=dir"${FIRST_TWO_DIGITS}";
mkdir -p "${DIR}";
mv "${FULL_FILE_PATH}" "${DIR}";
fi
done
それが完了したら、次のようにディレクトリをチェックしls -1
、返された出力は次のとおりです。
dir01-01
dir01-02
dir02-01
dir02-02
ディレクトリは存在しますが、ファイルがコピーされたことを確認するために、次のようls
にコマンドを実行しました。出力は次のとおりです。*
ls -1 *
dir01-01:
file01-01-01
file01-01-02
dir01-02:
file01-02-01
file01-02-02
dir02-01:
file02-01-01
dir02-02:
file02-02-02