こんにちは

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

よろしくお願いします。

このQ&Aに関連する最新のQ&A

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

そもそも、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
    • 0

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


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

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



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

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

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

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

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

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

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q作成日時でのファイル検索

この日付に作成されたファイルの検索を行いたいのですが、どのようなコマンドを使用すれば良いのでしょうか?

findコマンドで可能なのでしょうか?

調べても分からなかったので、お教えいただければ幸いです。

Aベストアンサー

unix/linuxではファイルの作成日時は記録されないので、そもそも不可能です。

最終更新日を find の -mtime で調べる位しか出来ないですね。通常だと、find コマンド実行の瞬間から遡って24時間ごとが日の区切りになります。つまり -mtime 1 だとこの瞬間から24時間以内に更新されたファイルがヒット。
-daystart オプションも追加すれば、現在日(つまり時刻は考慮しないで)からの相対日で検索できます。
-daystart -mtime 1 で昨日の0時から23:59までに更新したファイルがヒット。

相対日を直接求めるコマンドは無いので、
date -d "100 days ago" のようにして数字を変えて試行錯誤するしかないです。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

Qレッドハットのバージョン確認方法

自分のサーバで使用しているREDHATのバージョン確認はどうすればいいのでしょうか?

more /etc/issue
とやっても英文しか出てきませんでした。

uname -all
でもカーネルのバージョンは出るのですが、REDHATのバージョンは出ませんでした。

Aベストアンサー

> more /etc/issue
> とやっても英文しか出てきませんでした。

その英文にはRedHatのバージョンは書いてなかったのですか?
書いていなかったとしたら、管理者により編集されている可能性
がありますね。

cat /etc/redhat-release

ではいかがでしょう?
やっぱり英文ですけど。

rpm -q redhat-release

でもいいかも

QLinuxでディレクトリ内の最新ファイルとファイル数を取得したいです。

ディレクトリ内にファイルが多すぎて
lsしても画面が流れてしまい困っています。

・ディレクトリのファイル数を取得したい
・ディレクトリ内の最新ファイルの日付を取得したい
のですがどうしたら良いでしょうか?

Aベストアンサー

> lsしても画面が流れてしまい困っています。
ls -ltr | more /// スペースキーで画面スクロール。
ls -ltr | tee a.txt /// a.txt にファイル名が出力されます。(リダイレクト">"よりはいいですよ。)

>・ディレクトリのファイル数を取得したい
ls -ltr | wc -l

>・ディレクトリ内の最新ファイルの日付を取得したい
ls -ltr | tail -1

Qfindでフォルダだけを検索

find / -name "apache*"
これを、フォルダだけヒットするような文にするとどうなりますか?

Aベストアンサー

がると申します。

find / -name "apache*" -type d
でいかがでしょうか?

Qシェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。

以下の単純なシェルスクリプトを実行しようとしています。
-------------------
#!/bin/sh
echo ok
-------------------
そのとき、
bad interpreter: そのようなファイルやディレクトリはありません
と出てしまいます。

・which sh で確認すると /bin/sh です。
・Windowsで作ったファイルをFTPのアスキーモードで転送しています。

(ものすごく単純なミスをしてるのかもしれませんが、)
よろしくお願いします。

Aベストアンサー

1行目の「/bin/sh」のうしろにCRが入っていると、このような現象が発生します。
FTPの転送モードが間違いなくアスキーモードになっているか、
転送後のファイルにCRがついていないかなど、再度確認してみてください。

CR以外のコントロールコードや全角スペースなどがついていても似た現象が起こります。
その場合はエラーメッセージが多少異なるはずですが、併せて確認しておくと良いかと思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報