删除除最新文件以外的所有内容

Dal*_*vić 8 linux filesystems

假设我有一个目录?oo/,其中包含某种目录结构中的大量文件。我需要保留其中一些,但不是全部。

有没有办法(就地)删除除(比如)500个最新的之外的所有内容?

Pet*_*lam 11

我定期执行此任务,并使用以下变体。它是一个结合了各种简单工具的管道:查找所有文件,添加文件修改时间,排序,删除文件修改时间,首先显示除 500 之外的所有行,然后删除它们:

find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
    sort -r | cut -c14- | tail -n +501 | \
    while read file; do rm -f -- "$file"; done
Run Code Online (Sandbox Code Playgroud)

几点意见:

  • 如果你使用“bash”,你应该使用“read -r file”,而不仅仅是“read file”。

  • 使用“perl”删除文件更快(并且比while循环更好地处理文件名中的“奇怪”字符,除非您使用“read -r file”):

    ... | tail -n +501 | perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
    
    Run Code Online (Sandbox Code Playgroud)
  • 某些版本的“tail”不支持“-n”选项,因此您必须使用“tail +501”。跳过 500 第一行的便携式方法是

     ... | perl -wnle 'print if $. > 500' | ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您的文件名包含换行符,它将不起作用。

  • 它不需要 GNU 查找。

结合上面的给你:

find foo/ -type f | perl -wple 'printf "%12u ", (stat)[9]' | \
    sort -r | cut -c14- | perl -wnle 'print if $. > 500' | \
    perl -wnle 'unlink() or warn "$_: unlink failed: $!\n"'
Run Code Online (Sandbox Code Playgroud)