试图删除所有,但最近在子目录2档(Trying to delete all but most rec

2019-09-01 00:45发布

我创建所有的指定文件夹中,清理子目录一个cron(仅适用于第一个孩子),但最近的两个文件,但运行到的问题。

这是我的尝试:

find ./ -type d -exec rm -f $(ls -1t ./ | tail -n +4);
find . -maxdepth 2 -type f -printf '%T@ %p\0' | sort -r -z -n | awk 'BEGIN { RS="\0"; ORS="\0"; FS="" } NR > 5 { sub("^[0-9]*(.[0-9]*)? ", ""); print }' | xargs -0 rm -f

我也试图创建通过总减2要去意向文件的数组,但数组不是所有的文件填充:

while read -rd ''; do      x+=("${REPLY#* }");  done < <(find . -maxdepth 2 -printf '%T@ %p\0' | sort -r -z -n )

可能有人请给我一只手,并解释他们是如何做呢?

Answer 1:

不同于现有的答案,这一个NUL-划界找到输出,因此是安全的绝对与任何合法字符的文件名 - 一组,其中包括换行符:

delete_all_but_last() {
  local count=$1
  local dir=${2:-.}
  [[ $dir = -* ]] && dir=./$dir
  while IFS='' read -r -d '' entry; do
    if ((--count < 0)); then
      filename=${entry#*$'\t'}
      rm -- "$filename"
    fi
  done < <(find "$dir" \
             -mindepth 1 \
             -maxdepth 1 \
             -type f \
             -printf '%T@\t%P\0' \
           | sort -rnz)
}

# example uses:
delete_all_but_last 5
delete_all_but_last 10 /tmp

请注意,它需要GNU查找和排序GNU。 (现有的答案还需要GNU FIND)。



Answer 2:

它列出了所有,但最近的两个文件:

find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -2 

说明:

  • -type f仅列出文件
  • -printf '%C@ %P\n'
    • %T@自1970年以来显示文件的最后修改时间以秒计。
    • %P显示文件名
  • | sort -n | sort -n做数字排序
  • | cut -d' ' -f2- | cut -d' ' -f2-降秒形式输出,只留下文件名
  • | head -n -2 | head -n -2显示所有,但最后两行

因此,要删除所有这些文件只是通过附加管它xargs rmxargs rm -f

find -type f -printf '%T@ %P\n' | sort -n | cut -d' ' -f2- | head -n -2 | xargs rm


Answer 3:

我正好碰到了同样的问题,这就是我如何解决它:

#!/bin/bash

# you need to give full path to directory in which you have subdirectories
dir=`find ~/zzz/ -mindepth 1 -maxdepth 1 -type d`

for x in $dir; do
        cd $x
        ls -t |tail -n +3 | xargs rm --
done

说明:

  • 与尾-n +号你决定子目录中有多少个文件离开


文章来源: Trying to delete all but most recent 2 files in sub directories