【シェル】日付が最も古くサイズが小さいファイル削除

このQ&Aのポイント
  • ディレクトリ内のファイルで、日付が最も古いかつサイズが小さいものを削除するシェルを作成しようと考えています。
  • ls -lStrコマンドを使用して、ファイルを日付が古い順かつサイズが小さい順にソートします。
  • lsコマンドで表示した2行目のファイル名を取得し、変数に格納してrmコマンドで削除する流れを考えています。
回答を見る
  • ベストアンサー

【シェル】日付が最も古くサイズが小さいファイル削除

ディレクトリ内のファイルで、日付が最も古い&(且つ)サイズが小さいものを削除するシェルを作成しようと考えています。 当初の以下のような考えをしていましたが、うまくいかないので質問しました・・・ ls -lStr(カレントディレクトリで日付が古くサイズが小さい順のつもり・・・) 上記のコマンド実行にて、 合計 100 -rwxr-xr-x 1 root root 333 2月 22 2009 java.log と表示されるのを利用し、上から2行目のファイル名を取得するためawkして『java.log』というファイル名をprintfで表示させ変数か何かに格納し、rmコマンドで削除という流れを考えていました。 よくよく考えると ・ls -lStr は本当に日付が古くサイズが小さいものでソートされているのか ・lsコマンドで表示した『2行目』という指定でファイル名の取得できるのか がよくわからなくなってしまいました。 上記の考え方よりこっちのほうが良い!やアドバイスがあれば非常に嬉しいです。 よろしくお願いしますm(__)m

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

「最も古い&(且つ)サイズが小さいもの」は、ちょっと意味が不明です。両方の条件が成り立つとはかぎりません。 「最古だけどファイルサイズが最小ではないもの」 「最古ではないけどファイルサイズは最小のもの」 の2つのファイルがある場合、どちらが削除対象ですか? 「最小ではなくても、とにかく最古」が対象なら、ls -tr 「最古ではなくても、とにかく最小」が対象なら、ls -Sr になるでしょう。 あと、lsのソート順オプションが決まったとして、その一覧の先頭に来ているファイルを削除する方法についてですが、 ls に-l オプションを付ける必要はないでしょう。 -lオプションなしならファイル名だけが表示されますから、それがそのまま削除対象として使えます。 あとは、head コマンドを使って ls -tr | head -1 で、lsの結果の先頭1行だけが表示されますから、 rm `ls -tr | head -1` とすれば、そのファイルだけが削除されます。 (これは、最古の1ファイルを削除する例になります)

fbjapanblue
質問者

お礼

最初の条件はディレクトリ内にある更新が古い日付順(同日同時刻ファイル複数) でソートし、さらに同日同時刻の古い複数ファイルの中でファイルサイズが小さいもの でソートというイメージでした。 1.最古の日付でソート 2.1.の中で更にサイズでソート のような感じです。 ちなみにlsの件はできました!ありがとうございました!

関連するQ&A

  • lsコマンドで表示するファイルの更新日付について

    お世話になります。 現在RedHatLinux AS2.1を使用しております。 ディレクトリの情報(ファイル名、ファイルサイズ、更新日付)を毎日取得して日々差異がないか確認しているのですが、 更新日付が昨日は 11月 10 2007 と表示していたのに、今日になって、 11月 10 10:30 と年のところが時刻になっていました。 11月10日なので、勿論今日(5/21)更新した訳でもなく、ファイルサイズも同じなので年の表示が時刻に変わっただけだと思います。 コマンドは、 ls -lh|cut -b 35- と35バイト目からだけを表示するようにしています。 lsコマンドで表示する更新日付は昨年までのファイルについては、年を表示して、同じ年度(2008年)のものは時刻が表示するものだと思っておりましたが、違ってるのでしょうか?コマンドがマズイですかね・・・。 結構基本的な事だと思うのですが、ネットで探してもなかなか見つからずここで質問させていただきます。 どうかよろしくお願いします。

  • Kシェルでファイル削除処理

    kシェルで、ファイルを1行ずつ読み込み、記述されたファイルを削除する処理を作成したいのですが、ワイルドカード指定にも対応したいです。最初はrm -r で実施しようとしたのですが、これだとディレクトリも削除されてしまうので使えませんでした。rm -fでやった場合も削除に失敗した場合のエラーハンドリングが難しく困っています・・・。 何か良い方法はないでしょうか? lsコマンドの出力結果を再度読み込み、ファイルだったら消すという方法ぐらいしか思い浮かばず・・・。

  • シェルスクリプトで古いファイルの自動削除をするには?

    UNIXで以下の仕様を持つシェルスクリプトを作成しようと していますが、どうもうまくいきません。 どなたか、いい知恵を貸していただけないでしょうか? 目的: 特定のディレクトリ内にあるファイルについて、 システム日付より3日前のタイムスタンプを持つファイルを 削除する。 留意点: ・削除対象のファイルは複数存在する場合がある。 ・ファイルサイズは1件あたり 0byte-数百Mbyte となる  可能性がある。 ・ファイル名は不定。 ・スクリプトはBシェルまたはCシェルとする。 参考: ・現在使用しているOSについて  ls -l でのタイムスタンプにおける出力形式は以下のとおり  (デフォルト値?)  ・ 9月 28日 2000年    または   10月 24日 10時45分 知っている限りのコマンドを使っていろいろやってみたんですが、 結局ダメでした。 よろしくお願いします。

  • ファイル名検索シェルについて

    いつもお世話になっております。 ファイル名を検索したいのですが。 あるディレクトリ内のls -ltで表示した上から3つ目のファイル名の『0511091457』を変数にsetしたい場合どのようにしたら良いでしょうか? 例: audit.log.0511091453 audit.log.0511091455 audit.log.0511091457   ←このファイルの『0511091457』を変数としてセットしたい audit.log.0511091507 audit.log.0511091542 以上の場合どのように記述すればよいでしょうか? 恐れ入りますが、ご教授願います。

  • lsの4096とディレクトリ容量計測方法について

    ls -la を実行すると サイズが4096というディレクトリ(test1とする)が多々見つかります。 またディレクトリによっては、0(test2とする)というのもありました。 ただ、test2ディレクトリの下に、file1というファイルがありサイズが10kでした。 【環境】 /root/test1(4096) /root/test2(0)   →file1(10K) /root/test3(4096) 【質問1】 ls -la で表示される4096とは何のことなのでしょうか? 【質問2】 ウインドウズのフォルダのように、ファイルサイズがディレクトリサイズに反映されてtest2に、 ディレクトリサイズが10kではなく、0と表示される理由は、なぜなのでしょうか? 【質問3】 各ディレクトリのサイズをlsで見れないとすれば、duコマンドで調べるしかないのでしょうか? 以上3点、 ご教授お願いします。

  • ファイル数を見て削除するシェルプログラム

    mysql のデータベースを mysqldump で取得して そいつを日付のファイル名をつけてバックアップを取っているのですが このままだとひたすら数が増え続けてしまいます。 ファイル数を決めておいて、ある一定数になれば古いものから削除していくような プログラムを書きたいのですが… ちなみにファイルは一つのディレクトリにあり db-20050101.tar.gz のようなフォーマットです。 よろしくお願いします。

  • Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する

    Cシェルプログラムで、あるディレクトリ上にあるファイルサイズが0バイトのものを削除する処理を作りたいのです。どのようなコマンドを使って組んだらよいのでしょうか?

  • シェルスクリプトファイルからjavaを実行したい

    シェルスクリプトファイル(拡張子が.shのファイル)からJavaを実行したいのですが上手くいきません。 コマンドラインで直接 cd javaのファイルが置いてあるディレクトリへのフルパス を実行した後 java 実行するクラス名 引数 とすると上手く動きます。 上記2行をshファイルにコピペしてみましたが、エラーになり動きません。 エラーは : No such file or directory cdをしている行とcdで移動しようとしているディレクトリパス Exception in thread "main" java.lang.NoClassDefFoundError: 実行するクラス shファイルの1行目に #!/bin/sh や #!/bin/bash を入れてみましたが、どちらも挙動が変わりません。(エラーのまま) shファイルはUTF-8を文字コードにして改行はLFのみです。 また、javaコマンドを実行するとき -cp や -classpath 引数でjavaのファイルが有るディレクトリを指定してみましたが挙動が変わりません。 shの実行はコマンドラインから sh shファイル(絶対パスで) source shファイル(絶対パスで) でやってみましたが駄目でした。 javaのファイルが有るディレクトリに対してパスを貼ってみましたが挙動が変わりません。 コマンドラインからコピペしてshファイルを作っていますので、フォルダ名等のつづりミスの可能性は低いと思います。 何か設定が足りないのでしょうか? よろしくお願いいたします。

  • ファイルの削除について

    初めて投稿します。Perl初心者です。 あるディレクトリ内のファイル(ファイル名はマシン日付.csvとなっています。例:20040906.csv)を検索し、 今日より90日前の日付を取得し、それ以前のファイルをディレクトリから削除する という操作をしたいと思うのですが。 Perlでこのようなファイル操作は可能なのでしょうか?

    • ベストアンサー
    • Perl
  • ファイルに名前がついていないファイルを削除したい

    viを操作中に、誤って操作したようで(オレじゃない)、無名ファイルと云うのでしょうか、ファイル名の無いファイルが 存在しています。 “ ls ”コマンドを叩いても標準出力されてない、“ ls -l ”だと、ファイル名以外全て標準出力されます。 “ ls -bl ”だと、 ¥177 とファイル名と云っていいのか、8進定数、エスケープシーケンス、文字コードなのか理解できてませんが とにかく一つのファイルとして存在しています。 そこでお知恵を拝借させて下さいませ。 この“ 名前の無いファイル ”をどうやって削除しますか? 最終手段は考えてます・・・ 必要なファイル全てを、別ディレクトリに退避(copy)して、その不可解なファイルが格納されている ディレクトリごと削除し、退避先から復活させる。 この手段は、業務中でもありとても危険を感じています。 理想的には、¥177ファイルを、mv(リネームと云うのか、ファイル名を付けると云うのか)してから 削除したいものです。 shellは ・csh ・tcsh ・bash あたりで・・・ 大変困っております。 どうか宜しく頼みます。