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

标签 linux bash perl shell delete-file

我有一个包含子目录的目录,我想从中删除所有名称包含 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/

相关文章:

从已安装的根驱动器备份 Mysql

linux - 为什么 HashiCorp 的 Vault 需要启用 ipc_lock 功能?

bash - 如何在不使用 bash 中的 printf 的情况下将字符转换为 ASCII

node.js - 如何在 bash 中抑制 npm WARN 弃用消息

Bash:如何使用运算符参数扩展${parameter@operator}?

linux - unix格式化输出变量

linux - 来自 epel 的失败 : nginx-1. 0.15-12.el6.x86_64.rpm

sql - SQL 中的数学运算?

perl - 使用XML::LibXML打印输出

perl - 通过仅加载模块的一部分来节省资源?