
recursionを使用してディレクトリを削除しようとしていますが、rm -rf
一部の内部ディレクトリに権限が設定されていないため失敗しますw
。私はこの問題を解決する方法を知っていますchmod
。ただし、これにはディレクトリ全体に対して2回の反復が必要であるため、速度が遅くなる可能性があります。
これらのディレクトリを一度に削除する方法はありますか? (自分に十分な権限を付与するのに十分な権限があると仮定)
sudo
はオプションではありません(そのコンピュータの制限されたユーザーとして)。
答え1
rsync
空の仮想ディレクトリを使用するのは問題ありません。
mkdir empty; rsync -r --delete empty/ targetdir/; rmdir empty targetdir
10回の繰り返しテストを含む簡単な例では、10〜14秒(14は異常値、他のすべての値は10〜11秒かかります)
とchmod -R u+w targetdir && rm -rf targetdir
19〜25秒かかります
。find targetdir -type d -exec chmod 755 {} \; && rm -rf targetdir
12秒〜16秒かかりますが、より複雑なフォルダ構造のため、rsyncよりも悪化する可能性があります。
答え2
find directory -type d -exec chmod 775 {} \;
rm -rf directory
答え3
性能測定はしていません。私はディレクトリを読むとすぐにすべてのファイルを削除するのが合理的であると推測しました(とにかく完全に読み込まれ、ページキャッシュから読み取られたメタデータが失われる可能性があるため)-depth
。そして、これらの権限を最初に変更します。 level サブディレクトリを選択し、必要に応じて変更します。ファイルやサブディレクトリが多いと、同じディレクトリの内容を再度読み取ることは避けにくくなり、ファイルがない方が高速です。
各ディレクトリに対して呼び出されるラッパースクリプトを使用することをお勧めします。このスクリプトはfind
- パラメータディレクトリ内のすべてのファイルを削除します。
- 必要に応じて、最初のレベルのサブディレクトリに対する権限の回復
- 各最初のレベルのサブディレクトリに対するスクリプト呼び出し
#!/bin/bash
set -x
dir_path="$1"
test -d "$dir_path" || exit 1
declare -i tests_x=0
declare -i tests_x_limit=30
while true; do
# there is a race condition between the -exec + and xargs
if [ -x "$dir_path" ]; then
break
else
sleep 1
fi
tests_x+=1
if [ "$tests_x" -gt "$tests_x_limit" ]; then
exit 1
fi
done
find "$dir_path" -mindepth 1 -maxdepth 1 -type f -delete -o -type l -delete \
-o -\( -type d ! -perm -700 -exec chmod u=rwx {} + , -print0 \) |
xargs -0 -n 1 -r "$0"
そしてそれを実行
deletion.sh /start/dir
rm -r
上記の方法はディレクトリを削除しないため、後で行う必要があります(IMHOのように便利な(つまり、より高速な)方法ではディレクトリを削除できません)rm -r
。
コマンド方法に関係なく、ファイルシステムのコミット時間を長くするのに役立ちます。だからext4
:
mount -o remount,commit=60 /path/to/mp
答え4
各ディレクトリで小さなシェルを実行してモードを変更し、内容を削除できます。
find . -depth -type d -exec sh -c 'echo "Removing $1 contents"; chmod +w "$1" ; rm -r "$1"/*' anything {} \;