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

abi*_*tio 3 linux bash shell perl delete-file

我有一个包含子目录的目录,我想从中删除名称包含out. 这样做的最快方法是什么?

我已经尝试了几件事。

一个简单的:

rm */*out*
Run Code Online (Sandbox Code Playgroud)

珀尔:

perl -e 'for ( <*/*out*> ) { ( (stat)[9] < (unlink) ) }'
Run Code Online (Sandbox Code Playgroud)

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

Perl:        ~25 mins
rm */*out* : ~18 mins
Run Code Online (Sandbox Code Playgroud)

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

有没有人有更快的方法来摆脱这些文件,因为这对我来说似乎非常慢?

Ole*_*nge 5

我发现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
Run Code Online (Sandbox Code Playgroud)