删除所有文件并仅保留最新文件的脚本

删除所有文件并仅保留最新文件的脚本

关于如何删除所有文件并仅在每个子目录中保留最新文件(从特定目录开始)有什么建议吗?这是我尝试过的:

#!/bin/bash

find /home/ftp/ -type f | while IFS= read -r line
do
  find "$line" -type f | head -n -1 | while read file
  do
    #rm -f "$file"
    echo "$file"
  done
done

我在 /home/ftp/upload 和 /home/ftp/download 中有 2 个子目录。两个子目录中每个子目录都有 2 个文件。

当测试上面的脚本时,没有文件名回显。

答案1

使用zsh, 从当前目录:

for dir (**/*(N/)) {
  files=($dir/*(N.om))
  (($#files > 1)) && echo rm -f -- $files[2,-1]
}

如果您希望考虑隐藏目录和文件,请添加Dglob 限定符。

那就只考虑常规的文件。如果您想要其他类型的文件,例如设备、套接字、命名管道,或者如果您想遵循符号链接,则可以使用更多 glob 限定符对其进行调整。

删除echo以实际执行任务。

使用最新的 GNU 工具和 POSIX shell:

(export LC_ALL=C
find . -type f -printf '%T@\t%p\0' |
  sort -rzn |
  cut -zf2- |
  gawk -v RS='\0' -v ORS='\0' '
    match($0,/.*\//) && n[substr($0,1,RLENGTH-1)]++' |
  xargs -r0 echo rm -f
)

相关内容