
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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux JSLinuxについて。 Linuxのこの手順のプログラミングは合っているでしょうか。 ①ホームディ 2 2022/06/20 15:33
- UNIX・Linux Linuxについて質問です。 シェルスクリプト名をfind.shとして、以下の条件をすべて満たすファ 1 2023/02/03 03:50
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- PHP ファイルアップロードに関してのセキュリティについてアドバイスお願い致します 1 2023/08/20 00:25
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- その他(OS) アプリの起動に必要なファイルについて 1 2023/04/23 17:53
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- その他(開発・運用・管理) バッチファイルで特定のファイル・ディレクトリ以外を削除する方法について 4 2022/05/31 14:03
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FTPでPUTできない原因は何?
-
7zを使うとフォルダの中身がす...
-
ftpのmgetコマンドの自分の格納...
-
ファイル名で / (スラッシュ...
-
拡張子.dどういう意味
-
シンボリックリンクについて
-
zorin os lite 15 のデスクトッ...
-
OSXでのユーザー認証 (htacces...
-
RHELを使っています。これまで/...
-
linuxコマンド mkdirでディレ...
-
Linuxシェルを使ったフォルダの...
-
Minecraftにforgeを入れたら、...
-
ディレクトリ監視シェルスクリプト
-
サーバー間のデータコピー(デ...
-
「照合パターンに合いません」...
-
シンボリックリンクについて
-
linuxのコマンドラインで、拡張...
-
tar(*.tgz)ファイルの解凍の際...
-
#./configureの時点でダメです。
-
パスを通す
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
7zを使うとフォルダの中身がす...
-
ファイル名で / (スラッシュ...
-
ftpのmgetコマンドの自分の格納...
-
拡張子.dどういう意味
-
make時に出てきたエラーメッセ...
-
FTPコマンドのCDについて
-
バッチファルの置き場所
-
ホームページのディレクトリを...
-
「照合パターンに合いません」...
-
linuxコマンド mkdirでディレ...
-
"cp -a"と"cp -r"の違い
-
FTPでPUTできない原因は何?
-
/(スラッシュ)で区切ったフル...
-
Linuxコマンドについて
-
tarでディレクトリのみをアーカ...
-
ftpでのフォルダごとの転送はで...
-
zorin os lite 15 のデスクトッ...
-
scpによるデータ転送後、ディレ...
-
unzipコマンドでディレクトリな...
-
2TBのUSBメモリを2000円ほどで...
おすすめ情報