日付で区切られたサブディレクトリにファイルを移動する方法

日付で区切られたサブディレクトリにファイルを移動する方法

ここ数年で最後に変更されたファイルを含む大きなディレクトリがあります。サブディレクトリを生成するインタラクティブbashシェルに一度入力できる簡単なコマンドはありますか?それぞれ4桁の年に名前が付けられ、その中の情報が信頼できない場合は、そのファイルを次の場所に移動します。ファイルの年齢に関連するファイル名を持つ各サブディレクトリを確認し、最後に私が実行しているすべてが正しく機能し、ファイルやデータが失われていないことを確認しますか?

たとえば、次のような完全に間違った例があります。

$ cd ~/Documents
$ ls -lhrt
...
-rw-r--r--  4 user   user    4.0K Jun 29  2017 oldfile.txt
-rw-r--r--  4 user   user    4.0K May 15  2018 2018file.md
-rw-r--r--  4 user   user    4.0K Apr 14  2019 04.dat
-rw-r--r--  4 user   user    4.0K Jul 21  2019 somepage.html
drw-r--r--  4 user   user    4.0K Jul 21  2019 somepage_files
-rw-r--r--  4 user   user    4.0K Mar 13  2020 march.dat
-rw-r--r--  4 user   user    4.0K Feb 12 18:03 file02.dat
-rw-r--r--  4 user   user    4.0K Oct 11 18:03 OctReport.txt

完了したら、次の結果を得たいと思います。

$ cd ~/Documents
$ find .
.
./2017
./2017/oldfile.txt
./2018
./2018/2018file.md
./2019
./2019/04.dat
./2019/somepage.html
./2019/somepage_files
./2019/somepage_files/...
./2020
./2020/march.dat
./2021
./2021/file02.dat
./2021/OctReport.txt

ベストアンサー1

forループを使用してディレクトリを作成して、date各ファイルの変更年を取得できます(ここではGNUまたはそのdateオプションが互換性があると仮定します)。-rこれにより、各ファイルがそのディレクトリに移動されます。

for file in *; do
    [ ! -L "$file" ] &&
      dir_name=$(date -r "$file" +%Y) &&
      mkdir -p "$dir_name" &&
      mv -- "$file" "$dir_name"
done

おすすめ記事