chdir
ディレクトリに移動し、への相対パスを使用する場合、長いパス名は必要ありませんrmdir
。
または、POSIXシェルがインストールされている場合、またはこれを同等のDOSに移植する場合:
# untested code, didn't bother actually testing since the OP already solved the problem.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # repeat more times to work in larger batches
rm -r Folder1 # remove the first several levels remaining after moving the main tree out
# then repeat to end up with the remaining big tree under the original name
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(ループ条件のために名前を変更した場所を追跡するためにシェル変数を使用することは、私がそこで行ったようにループを展開する他の選択肢です。)
これにより、KenDのソリューションのCPUオーバーヘッドが回避されます。これによりn
、新しいレベルが追加されるたびにOSがツリーを上から次のレベルに移動し、アクセス許可などがチェックsum(1, n) = n * (n-1) / 2 = O(n^2)
されます。O(n)
Windowsが親ディレクトリの名前を変更するときにツリーをトラバースする必要がない限り、チェーンの先頭からチャンクを切り落とすソリューションはである必要があります。(Linux / Unixはサポートしていません。)OSがすべてをチェックする必要がない場合chdir
、ツリーの最下部までの相対パスを使用して、chdir
バックアップ時にディレクトリを削除するソリューションもO(n)
必要です。どこかでCDを作成しているときに何かをするときは、すべてのシステムコールの親ディレクトリ。
find Folder1 -depth -execdir rmdir {} +
最も深いディレクトリにCDを作成している間にrmdirを実行します。または、実際には、findの-delete
オプションはディレクトリで機能し、を意味し-depth
ます。したがってfind Folder1 -delete
、まったく同じことを行う必要がありますが、より高速です。ええ、LinuxでのGNU findは、ディレクトリをスキャンrmdir
し、相対パスで、次に相対パスで、次にchdir("..")
。昇順ではディレクトリを再スキャンしないため、O(n)
RAM を消費します。
これは実際には近似値でした。strace
実際に、、およびを使用しunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
、多数の呼び出しが混在していることを示しています。ただし、findの実行中にディレクトリツリーが変更されない場合、効果は同じです。open("..", O_DIRECTORY|...)
fchdir(the fd from opening the directory)
fstat
編集:ちょうどキックのために、私はGNU / Linux(Ubuntu 14.10、2.4GHzの第一世代Core2Duo CPU、WD 2.5TB Green Powerドライブ(WD25EZRS)上のXFSファイルシステム)でこれを試しました。
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
real 0m1.141s
user 0m0.005s
sys 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lines / 2k words / 38M characters of text
ll -R annoyingfoldername
... eventually
ls: cannot access ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername: File name too long
total 0
?????????? ? ? ? ? ? annoyingfoldername
time find annoyingfoldername -delete
real 0m0.054s
user 0m0.004s
sys 0m0.049s
# about the same for normal rm -r,
# which also didn't fail due to long path names
(mkdir -pは、ディレクトリと不足しているパスコンポーネントを作成します)。
はい、2k rmdir操作の場合、実際には0.05秒です。xfsは、メタデータの操作を10年前のように遅くしていたため、ジャーナルでメタデータ操作をまとめてバッチ処理するのに非常に優れています。
ext4では、作成は0m0.279秒かかり、検索で削除は0m0.074秒かかりました。
/MIR
代わりに試してみます:笑いのためだけにROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
実行する価値があるかもしれませんchkdsk
。