- ベストアンサー
古いファイルを含むディレクトリのリネーム
- Linuxサーバのファイル整理の目的で指定ディレクトリ以下の階層の複数フォルダについて古い画像ファイル(90日以上変更がない'.jpg'ファイル)しかないものはディレクトリ名をリネームしてディレクトリ内の古いファイルを削除する方法について教えてください。
- 特定のディレクトリ内の複数のフォルダについて、90日以上変更がない'.jpg'ファイルしか含まれていない場合に、ディレクトリ名をリネームし、ディレクトリ内の古いファイルを削除する方法について教えてください。
- CentOS5.4の環境で、特定のディレクトリ以下の階層の複数のフォルダについて、90日以上変更がない'.jpg'ファイルしか含まれていない場合に、ディレクトリ名をリネームし、ディレクトリ内の古いファイルを削除する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
うあ、間違いです。日本語でリネームと書きながらそのあとでディレクトリ削除のつもりになってました。 rmdirはディレクトリが空の時だけ削除してくれますが、mvにはそんな機能は無いので空かどうか自分で調べないといけません。 find . -type f -ctime +90 -print0 > files.tmp xargs -0 rm < files.tmp while read -r -d $'\0' file ### NUL区切りで読み込む do dir="${file%/*}" ### ディレクトリ名部分を取り出す if test -d "$dir" -a -z "`ls -A "$dir"`" ### まだ消されてなくてls -Aの結果が空なら then mv "$dir" "$dir"_deleted ### リネームする fi done < files.tmp rm files.tmp
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
>整理の対象フォルダ内には、空ディレクトリも含まれる可能性があり(1)の処理を行ったディレクトリに対してのみリネームを行えばと考えております。 -print0 を使っているということはファイル名かディレクトリ名に特殊文字があるのでしょうか?その場合にもうまく動くかどうかわかりませんが、 find . -type f -ctime +90 -print0 > files.tmp xargs -0 rm < files.tmp xargs -0 -n 1 -i < files.tmp rmdir `dirname {}` 2>/dev/null rm files.tmp 対象ファイルのパス名からdirnameでディレクトリ部分をとりだしてrmdirに渡します。 rmdirは、ディレクトリが空でなければ消しませんので大丈夫です(エラーメッセージが出るので/dev/nullにリダイレクトしておく)。
お礼
ご回答ありがとうございます。 ご推察の通り、ディレクトリ名に空白など特殊文字があるため -print0を使っております。 ちなみに追加回答いただいた内容だと ディレクトリのリネームの処理が抜けると思いますが どこにmv {} {}_deleted \; の処理をいれればいいのでしょうか? find . -type f -ctime +90 -print0 > files.tmp xargs -0 rm < files.tmp xargs -0 -n 1 -i < files.tmp rmdir `dirname {}` 2>/dev/null xargs mv {} {}_deleted \; rm files.tmp
- notnot
- ベストアンサー率47% (4900/10358)
(2)を行った結果空になったディレクトリをリネームするということですね? find . -type d -empty -exec mv {} {}_deleted \;
補足
回答ありがとうございます。 前提条件となるご説明が足りず申し訳ございません。 整理の対象フォルダ内には、空ディレクトリも含まれる可能性があり (1)の処理を行ったディレクトリに対してのみリネームを行えばと考えております。
お礼
ご回答ありがとうございます。 ご助言のおかげで対応できました。 但し、2回目の処理を実行しようとすると、rm処理にてエラーとなってしまうため 以下の様に改良いたしました。 find . -type f -ctime +90 -print0 > files.tmp xargs --no-run-if-empty -0 rm < files.tmp ありがとうございます。