gpt4 book ai didi

linux - 从名称包含特定字符串的目录树中删除文件的最快方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:41 25 4
gpt4 key购买 nike

我有一个包含子目录的目录,我想从中删除所有名称包含 out 的文件。最快的方法是什么?

我试过很多东西。

一个简单的:

rm */*out*

Perl:

perl -e 'for ( <*/*out*> ) { ( (stat)[9] < (unlink) ) }'

每一个似乎都需要很长的时间。对于 1,000 个子目录,每个子目录包含大约 50 个匹配 *out* 的文件,需要:

Perl:        ~25 mins
rm */*out* : ~18 mins

我也试过 rsync,先将文件移动到一个文件夹,然后用删除同步,但这需要很长时间。

有没有人有更快的方法来删除这些文件,因为这对我来说太慢了?

最佳答案

我发现 test3 是最快的(11-25 秒)。但为什么不自己测试呢?

您的文件系统会对性能产生重大影响。

测试使用GNU Parallel .

# Make test set: 150000 files, 50000 named *.seq
testset() {
doit() { mkdir -p $1 ; cd $1 && parallel --results ./{} seq ::: {1..50}; }
export -f doit
seq 1000 | parallel --bar doit >/dev/null

# Drop caches before starting a test
echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null
}
export -f testset

# Define tests
test1() {
find . -name '*seq' | perl -ne 'chop;unlink'
}
export -f test1
test2() {
find . -name '*seq' -delete
}
export -f test2
test3() {
find . -name '*seq' | parallel --pipe -N1000 -q perl -ne 'chop;unlink'
}
export -f test3
test4() {
find . -name '*seq' -print0 | xargs -0 -P2 rm
}
export -f test4
test5() {
find . -name '*seq' -print0 | xargs -0 rm
}
export -f test5
test6() {
find . -name '*seq' | perl -e 'chomp(@a=<>);unlink @a'
}
export -f test6
test7() {
# sort by inode
ls -U -i */*seq* | sort -k1,1 -n| cut -d' ' -f2- | perl -e 'chomp(@a=<>);unlink @a'
}
export -f test7

# Run testset/test? alternating
eval parallel --joblog jl -uj1 ::: testset' 'test{1..7}
# sort by runtime
sort -nk4 jl

关于linux - 从名称包含特定字符串的目录树中删除文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com