アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは

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日がないなど)

よろしくお願いします。

A 回答 (4件)

ファイルの日付を取得するには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. …
http://sweng.web.fc2.com/ja/program/bash/read-ea …

一例ですが、
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の部分のカラムの位置等は実際に確認をしてから適宜変更する必要があります。

以上、ご参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます。

awk で欲しい情報が取得できました。
助かります。

基礎をやらないとダメだと痛感し、ちょっと厚めの自習本を買いました。

お礼日時:2014/07/12 20:19

実際にやってはいませんが…まぁ、目安として。



>1. ファイルの作成日を調べる

statコマンドで-cオプション付で指定したらよいかと。
作成日がどれにあたるのかは不明ですが。
# ModifyなのかChangeなのか…。
http://linuxjm.sourceforge.jp/html/GNU_coreutils …
%W辺りですかねぇ…。
で、UNIX TIMEなどで取得してdataコマンドで書式化してください。

>2. その作成日のフォルダがあれば調べる(なければ新規作成する)

testコマンドで有無の確認は可能かと。
# 「シェルスクリプト ディレクトリ 存在確認」辺りで検索すればそれなりに見つかるものと思われます。
ファイルの移動はmvコマンドで可能でしょう。

>3. 次のファイルをチェックする、以下ループ

普通にシェルスクリプトでループですかね。
    • good
    • 0

Ruby スクリプトで、手軽に書くと、こんな感じでしょうか。


第1引数にディレクトリを指定します。
http://pastebin.com/UjkHSNmV
    • good
    • 0

そもそも、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/月/`
です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!