22

ディレクトリを削除してから送信するより速い方法はありますか

rm -r -f *directory*

? 私たちの毎日のクロスプラットフォーム ビルドは非常に大きいため、これを尋ねています (たとえば、ビルドあたり 4GB)。そのため、一部のマシンのハードディスクの容量が頻繁に不足しています。

これは、AIX および Solaris プラットフォームの場合です。

これらのプラットフォームでディレクトリを削除するための「特別な」コマンドがあるのでしょうか?

貼り付け編集(私自身の別の回答を質問に移動しました):

「rm -r -f」がなぜこんなに遅いのか、私は一般的に疑問に思っています。「rm」は「..」または「.」を変更するだけでよいわけではありません。ファイル システム エントリの割り当てを解除します。

何かのようなもの

mv *directory* /dev/null

いいだろう。

4

13 に答える 13

24

ファイルシステムからディレクトリを削除するには、rmが最速のオプションです。Linuxでは、RAMディスクでビルド(数GB)を実行することがあり、削除速度は非常に優れています:)さまざまなファイルシステムを試すこともできますが、AIX/Solarisでは多くのオプションがない場合があります...

ディレクトリ$dirを今すぐ空にすることが目標の場合は、名前を変更して、後でバックグラウンド/cronジョブから削除できます。

mv "$dir" "$dir.old"
mkdir "$dir"
# later
rm -r -f "$dir.old"

もう1つのトリックは、$ dir用に別のファイルシステムを作成し、それを削除する場合は、ファイルシステムを再作成するだけです。このようなもの:

# initialization
mkfs.something /dev/device
mount /dev/device "$dir"


# when you want to delete it:
umount "$dir"
# re-init
mkfs.something /dev/device
mount /dev/device "$dir"
于 2009-11-25T08:31:07.667 に答える
20

このトリックのソースを忘れましたが、うまくいきます:

EMPTYDIR=$(mktemp -d)
rsync -r --delete $EMPTYDIR/ dir_to_be_emptied/
于 2012-05-23T06:50:43.520 に答える
6

少なくとも AIX では、論理ボリューム マネージャーである LVM を使用する必要があります。当社のすべてのシステムは、すべての物理ハード ドライブを 1 つのボリューム グループにバンドルし、そこから 1 つの大きなファイル システムを作成します。

そうすれば、マシンに物理デバイスを自由に追加して、ファイル システムのサイズを必要なだけ大きくすることができます。

私が見たもう 1 つの解決策は、各ファイル システムにごみ箱ディレクトリを割り当て、mvfind cronジョブを組み合わせてスペースの問題に取り組むことです。

基本的に、cron10 分ごとに実行されて実行されるジョブがあります。

rm -rf /trash/*
rm -rf /filesys1/trash/*
rm -rf /filesys2/trash/*

次に、そのファイル システムの特定のディレクトリをリサイクルする場合は、次のようなものを使用します。

mv /filesys1/overnight /filesys1/trash/overnight

そして、次の 10 分以内にディスク容量の回復が開始されます。filesys1/overnightごみ箱に入れられたバージョンの削除が開始される前であっても、ディレクトリはすぐに使用できるようになります。

ゴミ箱ディレクトリは、削除したいディレクトリと同じファイルシステムにあることが重要です。そうしないと、比較的迅速な移動ではなく、大規模なコピー/削除操作が必要になります。

于 2009-11-25T08:52:49.460 に答える
5

rm -r directorydirectory を深さ優先で再帰し、ファイルを削除し、途中でディレクトリを削除することで機能します空でないディレクトリは削除できないため、削除する必要があります。

長くて退屈な詳細: 各ファイル システム オブジェクトは、ファイル システム全体のフラットな inode 配列を持つファイル システム内の i ノードによって表されます。[1] 最初にその子を削除せずにディレクトリを削除した場合、子は割り当てられたままになりますが、それらへのポインターはありません。(fsckファイルシステムの損傷を表しているため、実行時にそのようなことをチェックします。)

[1] それはすべてのファイル システムに厳密に当てはまるとは限りません。ガベージコレクターのようなものが必要になる可能性があります。ただし、私が知っているすべての一般的なオブジェクトは、fs オブジェクトが inode によって所有され、ディレクトリは名前と inode 番号のペアのリストのように機能します。

于 2009-11-28T23:27:05.263 に答える
3

rm -rfが遅い場合は、ディスクへの書き込み頻度が高すぎる「同期」オプションまたは類似のオプションを使用している可能性があります。通常のオプションを使用した Linux ext3 では、rm -rf非常に高速です。

Linux で動作し、おそらくさまざまな Unixen でも動作する高速削除のオプションの 1 つは、次のようなループ デバイスを使用することです。

hole temp.img $[5*1024*1024*1024]  # create a 5Gb "hole" file
mkfs.ext3 temp.img
mkdir -p mnt-temp
sudo mount temp.img mnt-temp -o loop

「穴」プログラムは、ディスク上に割り当てられたブロックではなく「穴」を使用して大きな空のファイルを作成するために私が自分で書いたものです。これははるかに高速で、本当に必要になるまでディスク領域を使用しません。 http://sam.nipl.net/coding/c-examples/hole.c

GNU coreutils に同様のプログラム「truncate」が含まれていることに気付きました。それがある場合は、これを使用してイメージを作成できます。

truncate --size=$[5*1024*1024*1024] temp.img

これで、mnt-temp の下にマウントされたイメージをビルドの一時ストレージとして使用できるようになりました。使い終わったら、次のようにして削除します。

sudo umount mnt-temp
rm test.img
rmdir mnt-temp

たくさんの小さなファイルを削除するよりも、1 つの大きなファイルを削除する方がはるかに迅速であることがわかると思います。

私の「hole.c」プログラムをコンパイルしたくない場合は、dd を使用できますが、これは非常に遅くなります。

dd if=/dev/zero of=temp.img bs=1024 count=$[5*1024*1024]  # create a 5Gb allocated file
于 2009-11-25T09:50:11.157 に答える
2

ディレクトリを削除するために引用したように、実際には「rm-rf」以外に何もないと思います。

手動で何度も繰り返すのを避けるために、次のような「十分に古い」場合、ビルドルートディレクトリのすべてのビルドディレクトリを再帰的に削除するスクリプトを毎日cronすることができます。

find <buildRootDir>/* -prune -mtime +4 -exec rm -rf {} \;

(ここで、mtime +4は、「4日より古いファイル」を示します)

もう1つの方法は、ビルダーを構成して(そのようなことが許可されている場合)、以前のビルドを現在のビルドでクラッシュさせることです。

于 2009-11-25T08:28:56.047 に答える
2

私もこれを調べていました。

600,000以上のファイルを含むディレクトリがありました。

エントリが多すぎるため、rm * は失敗します。

find . -exec rm {} \;5 秒ごとに ~750 個のファイルを削除していました。別のシェルを介して rm レートをチェックしていました。

そのため、代わりに、一度に多くのファイルを rm するための短いスクリプトを作成しました。5秒ごとに約1000ファイルを取得しました。アイデアは、効率を高めるために、できるだけ多くのファイルを 1 つの rm コマンドに入れることです。

#!/usr/bin/ksh
string="";
count=0;
for i in $(cat filelist);do
    string="$string $i";
    count=$(($count + 1));
  if [[ $count -eq 40 ]];then
    count=1;
    rm $string
    string="";
  fi
done
于 2011-09-07T06:38:06.637 に答える
1

Solaris では、これが私が見つけた最速の方法です。

find /dir/to/clean -type f|xargs rm

奇妙なパスを持つファイルがある場合は、使用します

find /dir/to/clean -type f|while read line; do echo "$line";done|xargs rm 
于 2014-01-17T17:34:33.777 に答える
1

rm よりも高速な小さな Java アプリケーション RdPro (Recursive Directory Purge tool) をコーディングしました。また、root の下でユーザーが指定したターゲット ディレクトリを削除することもできます。Linux/Unix と Windows の両方で機能します。コマンドライン版とGUI版があります。

https://github.com/mhisoft/rdpro

于 2014-11-22T18:13:12.727 に答える
0

Windows で 3,00,000 以上のファイルを削除する必要がありました。cygwinをインストールしました。幸いなことに、データベースにすべてのプライマリ ディレクトリがありました。for ループを作成し、行エントリに基づいて rm -rf を使用して削除します

于 2013-10-13T11:42:22.893 に答える
0

AWS EBS 1 TB ディスク (ext3) 上の多数のディレクトリから 700 G バイトを削除してから、残りを新しい 200 G バイトの XFS ボリュームにコピーする必要がありました。そのボリュームを 100%wa のままにしておくのに何時間もかかりました。ディスク IO とサーバー時間は自由ではないため、ディレクトリごとにほんの数分の 1 秒しかかかりませんでした。

/dev/sdb は任意のサイズの空のボリュームです

directory_to_delete=/ebs/var/tmp/

マウント /dev/sdb $directory_to_delete

nohup rsync -avh /ebs/ /ebs2/

于 2014-02-18T18:29:36.710 に答える