テスト目的で次のディレクトリを作成しました。
user@linux:~$ mkdir dir0{1..3}
user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei 31 10:45 dir01
drwxr-xr-x 2 user user 4.0K Mei 31 10:45 dir02
drwxr-xr-x 2 user user 4.0K Mei 31 10:45 dir03
user@linux:~$
それから削除しました。find -exec
user@linux:~$ find -type d -exec rmdir {} \;
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory
find: ‘./dir01’: No such file or directory
find: ‘./dir03’: No such file or directory
user@linux:~$
ディレクトリが削除されたことを確認しました。
user@linux:~$ ls -l
total 0
user@linux:~$
私の質問は次のとおりです
1)なぜこのようなメッセージがあるのかわかりません。理由をご存知ですか?
rmdir: failed to remove '.': Invalid argument
find: ‘./dir02’: No such file or directory
このエラーは表示されません。rmdir
user@linux:~$ mkdir dir0{1..3}
user@linux:~$
user@linux:~$ ls -l
total 12K
drwxr-xr-x 2 user user 4.0K Mei 31 22:58 dir01
drwxr-xr-x 2 user user 4.0K Mei 31 22:58 dir02
drwxr-xr-x 2 user user 4.0K Mei 31 22:58 dir03
user@linux:~$
user@linux:~$ rmdir *
user@linux:~$
user@linux:~$ ls -l
total 0
user@linux:~$
2) このメッセージを削除できますか?
ベストアンサー1
削除したばかりのディレクトリに入ろうとするので、find
「該当ファイルやディレクトリがありません」エラーが発生します。find
既定では、サブディレクトリに進む前に、現在アクセスしているディレクトリから一致するすべてのコンテンツにそのアクションを適用します。
make呼び出しに追加すると、-depth
検索パスに対して深度優先検索が実行されます。これは、ディレクトリから実行すると、すでにそのディレクトリにアクセスして再アクセスしようとしないことを意味します。find
find
rmdir
このため(has実装では)この-depth
オプションは暗黙的です。-delete
find
-delete
find . -depth -type d -exec rmdir {} \;
-depth
これはユーティリティの標準オプションですfind
。
rmdir
これは空のディレクトリでのみ機能することに注意してください。空でないディレクトリが多い場合、上記のコマンドを実行すると多くのエラーメッセージが生成されます。
代わりにfind
サポートしている場合は、以下を使用してください-empty
。
find . -type d -empty -delete
これにより、空のディレクトリが削除されます。
次のいずれかにfind
非標準はありません。-delete
-emtpy
find . -depth -type d -exec sh -c '
for dirpath do
set -- "$dirpath"/*
[ ! -e "$1" ] && rmdir "$dirpath"
done' sh {} +
見つかったディレクトリが空であることをテストし、空の場合は削除します。
これは、空でないディレクトリが原因でいくつかのエラーメッセージが表示されるのを防ぐための長いコードです。はい生成されたコンテンツが「許可拒否」エラーである可能性があるため、より興味深いものになることを願っています。エラーを/dev/null
一番上の最初のコマンドにリダイレクトすると、これらのエラーは非表示になります。find