Linuxコマンドでファイルを作成日ごとに分類する方法

このQ&Aのポイント
  • Linuxのコマンドを使用してファイルを作成日ごとに分類する方法を説明します。
  • フォルダAにあるファイルを作成日を参考にして、対応する日付のフォルダに移動する方法を解説します。
  • 作成日ごとに分類されたフォルダ内には、指定された拡張子(.MOV、.AVI)のファイルが保存されます。
回答を見る
  • ベストアンサー

Linuxコマンド:ファイルを作成日ごとに分類

こんにちは Linuxのコマンドでファイルを分類したいのですがやり方がよくわかりません。 記述の仕方を教えてください。特に作成日を取得してそこからフォルダを作るループがわかりません。 folderAに100件ほどファイルがあります。 ファイルの作成日に応じてフォルダに振り分け(移動)したいと思います。 1. ファイルの作成日を調べる 2. その作成日のフォルダがあれば調べる(なければ新規作成する) 例:作成日が「2014年6月27日」の場合は「2014年6月27日」というフォルダに入れる/作って入れる 3. 次のファイルをチェックする、以下ループ ファイルは *.{MOV,AVI} です。 終わった後は folderAの下に「2014年6月27日」や「2014年6月20日」などのフォルダができています。 folderAの直下に*.{MOV,AVI}は存在しなくなります。 1つの日付フォルダに複数のファイルが入ってもかまいません。 日付フォルダは抜けがあってもかまいません(20日と22日があって21日がないなど) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ファイルの日付を取得するにはlsコマンドの「--full-time」オプションを使用します。 実行例 >ls --full-time -rw-rw-rw- 1 hoge hoge 69 2014-06-27 14:00:00.158349853 +0900 test.txt 上記表記は一例です。 6カラム目が日付(2014-06-27)ですから、現在のディレクトリにあるファイルの日付のみを取得するのであれば、以下のコマンドで取得できますね。 >ls --full-time ./*.mov |awk '{print $6}' これをリダイレクトでlist1.txtに落とします。 >ls --full-time ./ |awk '{print $6}' > list1.txt 日付重複の可能性がありますから、list1.txtから重複行を削除します。 sort list1.txt |uniq > sorted_list1.txt これでsorted_list1.txt ファイルには「カレントディレクトリにある全ての.movファイルの日付一覧(重複削除済)」が完成したことになります。 あとは「このファイルの内容を1行目から順次読み込む」「読み込んだパラメータ(日付情報)にてディレクトリ作成→ファイルムーブ」すれば良いでしょう。 順次読み込みの例(参考URL) http://www.sssg.org/blogs/hiro345/archives/6559.html http://sweng.web.fc2.com/ja/program/bash/read-each-line.html 一例ですが、 filename=./sorted_list1.txt cat ${filename} |while read line do mkdir $line mv ` ls --full-time | grep $line | awk '{print $9}'` ./$line/. done というような感じの記述でしょうか。 (上記記述は動作確認していませんので、あくまで参考に・・・) ls --full-time の表記はOS等によって異なりますから、awkの部分のカラムの位置等は実際に確認をしてから適宜変更する必要があります。 以上、ご参考まで。

tuktukrace
質問者

お礼

ありがとうございます。 awk で欲しい情報が取得できました。 助かります。 基礎をやらないとダメだと痛感し、ちょっと厚めの自習本を買いました。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.4

そもそも、Unix/Linuxだと、ファイルの作成日は記録されていませんので、文字通りには不可能です。 ファイルの最終更新日でいいのなら、 cd folderA for x in *.MOV *.AVI do if test -f "$x" then date=`date -r "$x" +%Y年%m月%d日` mkdir "$date" 2>/dev/null mv "$x" "$date" fi done ただし、簡単にするために日付は2桁です(2014年06月27日など)。 上位ゼロを削除するなら、 date=`date -r "$x" +%Y年%m月%d日 | sed -e s/年0/年/ -e s/月0/月/` です。

回答No.3

Ruby スクリプトで、手軽に書くと、こんな感じでしょうか。 第1引数にディレクトリを指定します。 http://pastebin.com/UjkHSNmV

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

実際にやってはいませんが…まぁ、目安として。 >1. ファイルの作成日を調べる statコマンドで-cオプション付で指定したらよいかと。 作成日がどれにあたるのかは不明ですが。 # ModifyなのかChangeなのか…。 http://linuxjm.sourceforge.jp/html/GNU_coreutils/man1/stat.1.html %W辺りですかねぇ…。 で、UNIX TIMEなどで取得してdataコマンドで書式化してください。 >2. その作成日のフォルダがあれば調べる(なければ新規作成する) testコマンドで有無の確認は可能かと。 # 「シェルスクリプト ディレクトリ 存在確認」辺りで検索すればそれなりに見つかるものと思われます。 ファイルの移動はmvコマンドで可能でしょう。 >3. 次のファイルをチェックする、以下ループ 普通にシェルスクリプトでループですかね。

関連するQ&A

  • ファイルって日付で分類しますよね

    ファイルって日付でフォルダに分類するのがもっとも便利で効率的! で、あってますよね?

  • たくさんのファイルを日付名フォルダ作成に

    こんにちは、 今、txtファイルが数百あり、このファイルを作成日付ごとにフォルダ名を作成し、各フォルダ内に分類してしまうフリーソフトはないものでしょうか。 もし、ありましたら、URLを教えてください。 Win7に対応していればありがたいです。

  • バッチファイル作成で困っています

    ルートディレクトリの直下に、たくさんのフォルダが存在し、 すべてのフォルダ名がyyyymmdd形式の日付になっています。 例えば c:\20211215 c:\20220123 c:\20220302 c:\20220419 c:\20220524 ちなみに、本日の日付を表すフォルダ名が一番数字が大きいものです。(つまり未来の日付のものはありません) バッチファイルに引数を入れて、引数で指定した数字以降のものだけ すべてc:\workの下にフォルダごとxcopyするバッチファイルは どう作れば良いのでしょうか。 例えば、引数が20220225ですと、上記の例ではxcopyの対象は c:\20220302 c:\20220419 c:\20220524 の3つになります。 for /d ループになるように思いますが、お知恵(サンプル)をいただきたく。

  • 文書ファイル作成日変更できますか

    どんなファイルも作成、更新の日、時間がMY FOLDERなど開けば見れますが、それは過去に遡った日付に変えることはできるのでしょうか。

  • バッチファイルで複数のディレクトリのファイル削除

    バッチファイルで複数のディレクトリの中のCSVファイルを削除しようとしています。 D: ├─folderA | ├─fileA.csv | └─fileB.csv ├─folderB | ├─fileC.csv | └─fileD.csv └─folderC   ├─fileE.csv   └─fileF.csv このような階層で、カレントがD直下です。 D直下からfolderA、folderB、folderCの名前を指定せずに、 D直下にあるすべてのフォルダの中のcsvファイルをバッチで全部削除したいのです。 ワイルドカードを使えばいいのでしょうが、いまいちうまくいきません。 よろしくお願いします。

  • 画像の分類

    デジカメで撮影した画像ファイルを exifデータを使ってフォルダに分類できるソフトで お奨めなものは何でしょうか? 日付で分類するものはいくつかでているのですが、 シャッタースピードとか絞りの値で分類できるものはあるでしょうか? nikonから出ているF6 exifエクスプローラが使えるかなと思ったのですが、ビューワとしてしか使えずフォルダに分けることが出来ませんでした。

  • ファイルの作成日を変更したい

    お世話になります WINDOWS-xpです ファイルの作成日を変更したいのですが 便利なフリーソフトを教えてください 宜しくお願い致します 具体的な変更は、 特定のフォルダ-内のファイルを 変更必要なものだけを、一括もしくは 1つづつ日付入力していくようなやりかたです

  • ファイル作成日

    初心者です。 ファイルの作成日の日付が“01/11/2005”と表示されます。 “2005/1/11”と表示したいのですが、どうすれば良いですか?? 教えてください。

  • Linuxのコマンドについて

    閲覧ありがとうございます。 最近学校でLinuxについて勉強を始めました。 宿題のプリントが出されたのですが全く分かりません。 答えまたはコマンドのことを詳しく説明されているサイトがあればを教えて下さい。 ・/の下にあるフォルダー数は? ・現フォルダーのファイルの一覧を作成された時間順(古い方)に表示するコマンド ・「cp/etc/hosts」を実行したら、hostsというファイルはどこにコピーされるか ・もともと二つのファイル「A」「B」が存在するとき、「mv A B」というコマンドの効果は?警告は出ましたか? 宜しくお願いしますm(_ _)m

  • CD-Rを作成した日を知る方法はありませんか?

    1ヶ月ほど前に自分で焼いたCD-Rの「作成日」を知りたいと思っています。中に入っているフォルダやファイルの日付を見ましたが、それらはフォルダやファイル自身が作られた日付になっていて(すべて1年以上前)、残念ながらCD-Rを焼いた日を知る手がかりにはなりませんでした。何かいい方法はないものでしょうか?