
Linux で不要な古いファイルやディレクトリを消したいのですが、
どのようにすればいいのかわかりません。
具体的にはあるディレクトリの中にある
新旧混在となったファイルやディレクトリの中から
1ヶ月以上前に作ったファイルやディレクトリを消すといったことが
したいのです。
もちろんディレクトリの中に新しいファイルがいたら、
親ディレクトリは残すことを考えています。
find で -ctime +7 というオプションをつけて検索すれば
候補が得られるというところはわかったのですが、
ディレクトリもいるので簡単に rm では消せません。
rm -r なんてしたら新しいファイルも消しちゃうので・・・
どうか、お知恵をお貸しください。
No.4ベストアンサー
- 回答日時:
Linux なら find で -print0 が使えるし, xargs にも -0 ってオプションがあるはず.
find の -exec では 1つのファイルに対して 1回コマンドを実行するけど, xargs ならカーネルが許す限り長いコマンドを作って実行するので, -exec より xargs の方が fork&exec の回数が少なくなって効率的なはずです.
と思ってちょっと調べてみたけど, Wikipedia で xargs を調べてもらった方がいいかも.
print0 というオプションを知りませんでした。man して納得しました。まさにこれでした。
xargs についても Wikipedia で確認してみました。
いろいろテスト用にディレクトリやファイルを作成して動かしてみましたが、今のところ理想どおりの動きをしています。
すばらしいヒントありがとうございました!
スクリプトは最初のディレクトリの時間情報を保管する find で -print0 を、その情報をもとに空になっているディレクトリだけを削除する xargs の引数に -0 をつけることで、当初のベンチマークに対して幸せになれました。
今はさらに -exec から xargs に変更して、とりあえず完成かと考えています。
No.3
- 回答日時:
ど~でもいいけど, find の -exec より xargs の方がほぼ間違いなく効率的.
回答ありがとうございます。
昔は Tacosan のように思っていたのですが、
スペースを含むファイル名を扱う場合に xargs が正しく処理できないことが出てきて、
今では -exec を使っています。
ちなみに、xargs が効率的というのはどういったことがでしょうか?
実は今もいろいろ試行錯誤しているのですが、
xargs でスペース付きの名前をやり取りする方法が見つかれば
一気に幸せになれます。。。。
ちなみに今の状況は以下のようになっています。
/pub/temp の下にあるファイルに対して処理を行っています。
find /pub/temp/ -cmin +7 -type d > /tmp/__rm_pub_temp.list
find /pub/temp/ -cmin +7 -exec rm {} \; >&/dev/null
cat /tmp/__rm_pub_temp.list | xargs rmdir >&/dev/null
No.2
- 回答日時:
古いファイルの削除と空きになったディレクトリの削除を1度で行うのは無理かも?
2回に分けてfindを発行してはどうでしょうか?
1回目。
find 先頭ディレクトリ -type f -mtime +7 -exec rm -f {} \;
※ctimeだとファイルの作成日が対象になります。
※7日前に作成され、何かの理由で1日前に更新されたファイルは消えます。
※mtimeだと更新日(新規ファイルなら更新日=作成日)で見ますので
※こちらの方が良いかと。
2回目(ちょっと強引な手かもしれませんが)
find 先頭ディレクトリ -type d -exec rmdir {} \;
※rmdirは空でないディレクトリは削除しません。
※1回目のfindを実行した結果、空になったディレクトリが消えます。
※rmdirのメッセージが鬱陶しい時は >&/dev/null を{}の後ろに付けます。
実際に試したわけではないので参考意見として。
回答ありがとうございます。
今もいろいろ試行錯誤と悪戦苦闘してます。
mtimeでは他からファイルをコピーしたとき、
古いタイムスタンプであった場合に消されてしまうのでアウトでした。
ctime なら、持ってきた日になるのでこちらを採用しています。
理想的には atime が良かったのですが、
find を実行すると atime が更新されてしまい、不採用です。
またrmdir については、空ディレクトリが構造にある場合に
問答無用で消されてしまいます。
急に temp用ディレクトリ がなくなったとかで
既に駄目ダシされてしまいました。
ディレクトリ直下でファイルの変更などがあると、
親ディレクトリのctime/mtime 情報も変わってしまい、
ディレクトリを含めた処理に難しさを感じています。
でも今思いついたのですが、-ctime と -type d の組み合わせで
行けば何とかなりそうですね。
アクティブな空ディレクトリは残せそうです。
No.1
- 回答日時:
回答ありがとうございます。
パイプして xargs とか使わなくても、-exec を使えば削除はできます。
問題だったのは rm ではターゲットとなるディレクトリが
適切に消えてくれないということでした。
よく読むと質問が初心者っぽい内容でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名で / (スラッシュ...
-
7zを使うとフォルダの中身がす...
-
ftpのmgetコマンドの自分の格納...
-
FTPコマンドのCDについて
-
拡張子.dどういう意味
-
linuxコマンド mkdirでディレ...
-
「ドット(.)」と「¥」の意味...
-
シンボリックリンクを貼る=PAT...
-
バッチファルの置き場所
-
FTPでPUTできない原因は何?
-
xgraphのインストールについて
-
「照合パターンに合いません」...
-
LinuxでSGID設定する際、2775と...
-
"cp -a"と"cp -r"の違い
-
ディレクトリ名に改行コード(^...
-
tarでディレクトリのみをアーカ...
-
シンボリックリンクについて
-
シンボリックリンクについて
-
make時に出てきたエラーメッセ...
-
RHELを使っています。これまで/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル名で / (スラッシュ...
-
ftpのmgetコマンドの自分の格納...
-
7zを使うとフォルダの中身がす...
-
拡張子.dどういう意味
-
「照合パターンに合いません」...
-
make時に出てきたエラーメッセ...
-
"cp -a"と"cp -r"の違い
-
FTPコマンドのCDについて
-
linuxコマンド mkdirでディレ...
-
バッチファルの置き場所
-
scpによるデータ転送後、ディレ...
-
Linuxコマンドについて
-
シンボリックリンクについて
-
FTPでPUTできない原因は何?
-
zorin os lite 15 のデスクトッ...
-
ホームページのディレクトリを...
-
「ドット(.)」と「¥」の意味...
-
2TBのUSBメモリを2000円ほどで...
-
/(スラッシュ)で区切ったフル...
-
Minecraftにforgeを入れたら、...
おすすめ情報