
場合によっては、コマンドが完了するのを待たずに大量の一時ファイルを再帰的に削除し、ディレクトリ名をリサイクルしたい場合があります。 (たとえば、バージョン管理作業コピーを削除してチェックアウトしたい場合です。)
頻繁には発生しませんが、これが発生した場合は通常、次のコマンドを使用します。
mv "$oldname" dienow && rm -rf dienow &
もちろん、これに関数やエイリアスを作成できますが、そうでない場合は、上記の内容を短く表現する方法はありますか?
答え1
私は2つの別々のコマンドを使用します。
mv "$oldname" dienow
rm -rf dienow
これにより、記録から誤って1行を呼び出すと、単一のコマンドを実行して重大なダメージを与える可能性があります。このmv
コマンドは新しいバージョンであっても削除されず、削除することを宣言したものだけが削除されます。"$oldname"
rm
幸運なので、単一のコマンドのみを使用する必要がある場合は、関数として作成してください。
mv_then_rm () {
mv -- "$1" "$1.TO_BE_DELETED" && rm -rf -- "$1.TO_BE_DELETED" &
}
これは、「削除する」ディレクトリがすでに存在しないことを保証する複数の引数バージョンです。
mv_then_rm () {
local d tmpdir tmpdirs
tmpdirs=()
for d; do
tmpdir=$(mktemp -- "$(dirname -- "$d")/.deleting.XXXXXXXXXX")
tmpdirs+=$tmpdir
mv -- "$d" "$tmpdir"
done
rm -rf -- "$tmpdirs" &
}
答え2
あなたは「$oldname's」エンターテイメントを見逃しています。
mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &
私は誰かがrmをrm -iでエイリアスした場合は\ rmを使うことを好みます。
パスを明確にし、設定ファイルに関数として追加します。
clean_old_now(){
\mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &
}
誤ってこのようなことが起こるのではないかと心配な場合は、ヒントを追加してください。
clean_old_now(){
read -p "Are you sure?: " sure
if [[ $? = 0 ]] && [[ "$sure" = "y" ]]; then
\mv "$workdir/$oldname" $workdir/dienow && mkdir "$workdir/$oldname" && \rm -rf $workdir/dienow &
fi
}
明示的なパスを追加するときにデータがコピーされないように、mvが同じファイルシステムにあることを確認してください。
答え3
ㅏ非常に実用的なアプローチは、ディレクトリを/ tmpに移動し、システムの再起動に残りのタスクを実行させることです。または、定期的に(1時間に1回)クリーンアップするcronjobを設定します。
mv "$oldname" /tmp/forgetme
cronjobによる
0 * * * * rm -rf /tmp/forgetme