質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

3回答

3018閲覧

shellでのディレクトリ削除

zeijaku.net

総合スコア161

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2018/04/06 01:41

下記のコマンドでx日以上前のディレクトリは削除するということをしています。

find ${DIR} -type d -name 'test_*' -mtime +${DAY} -exec rm '{}' -rf ';' >> ${TEST_LOG}

上記のコマンドを実行すると正常にディレクトリは削除されているのですが下記のエラーが表示されます。

find: `/home/sample_user/test_1532512523215821': No such file or directory

ファイル削除時は問題なかったのですが、ディレクトリだとエラーとなってしまいます。
削除後にfindしているからだと思いますが、ファイル削除時は良くてディレクトリ時がNGな理由が分かりません。

エラーなくディレクトリを削除するにはどうすればよいかアドバイスいただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

findしているならrmの中の-rは要らないでしょう。
エラーが出るのは、サブディレクトリを下まで探索してrmを呼び出そうとしているfindと、指定されたディレクトリの下のサブディレクトリを全部削除しようとしているrmが競合しているからだと思います。コマンドが呼び出されて実行されるまでのタイムラグによって、僅差で削除されてしまったサブディレクトリに対してrmを実行しようとする状況が生じるのでしょう。

投稿2018/04/06 03:46

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikapy

2018/04/06 03:55

なるほどそうかもしれませんね。それなら、findで-maxdepthオプションを使えば解決するかも。
zeijaku.net

2018/04/07 05:06

findでtype d を付けているので検索結果はディレクトリだけだと考えていたのですが違っているという事でしょうか。
KojiDoi

2018/04/07 05:49

findはディレクトリを下の方にむかって検索していきます。rm -rは指定したディレクトリの下にあるディレクトリを全部消そうとします。やろうとしていることが被っているでしょ? すでに消えているものを再度けそうとして「見つからない」となるということです。
guest

0

ディレクトリ階層の深いものから順に消していけば解消すると思います。
まずは find の実行結果を ディレクトリ階層の深いもの = 文字列長の長いもの としてソートしてみます。

実験

bash

1# (1)以下のようなディレクトリがあるとして 2$ tree 3. 4└── aaa 5 ├── bbb 6 │   └── ccc 7 └── d ddd 8 └── ee 9 105 directories, 0 files 11 12# (2)findで検出したディレクトリを、文字列長の長いものから順にソートする 13# (見やすいように'\'をつかって改行しています。) 14$ find . -type d \ 15 | awk '{ print length, $0 }' \ 16 | sort -nr \ 17 | cut -d" " -f2- 18./aaa/d ddd/ee 19./aaa/bbb/ccc 20./aaa/d ddd 21./aaa/bbb 22./aaa 23.

適用

実験結果を適用すると以下のようになります。

bash

1$ find ${DIR} -type d -name 'test_*' -mtime +${DAY} \ 2 | awk '{ print length, $0 }' \ 3 | sort -nr \ 4 | cut -d" " -f2- \ 5 | while read -r d; do echo "$d"; done

いかがでしょうか?

投稿2020/02/12 23:07

編集2020/02/12 23:10
genzouw

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

test_*ディレクトリ内とその子孫にはtest_*という名前のディレクトリはないということだと、お書きのコマンドで大丈夫なはずです。

おそらくそうじゃないと言うことだと思いますが、

plain

1test_a --+-- test_b ----- ファイル 2 +-- test_c ----- ファイル 3 +-- ファイル
test_atest_btest_c
古い古い古くない

の場合、深い方から順番にやると決めると、test_bを削除すると、test_aのタイムスタンプが更新されますが、どうしますかね?
何日かして、test_cが古い扱いとなって、削除するとまたtest_aが更新され、test_aの削除が遅れてしまいます。

浅い方から順番にやると、

test_atest_btest_c
古い古い古くない

の場合、test_aの削除になるので、test_cまで消えてしまいます。

投稿2018/04/06 04:26

編集2018/04/06 04:39
otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zeijaku.net

2018/04/07 05:06

回答ありがとうございます。 こちらの意図としては「指定日数より古いディレクトリを削除したい」というものです。 その際にディレクトリの中に何が入っていようと対象ディレクトリが古ければ削除したいのです。 私の認識としてはコマンドの内容は 指定ディレクトリにあるtest_*から始まるディレクトリで、指定日数より古いものは削除 しているだけのつもりですが動作的には違っているということでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問