정렬한 후 삭제할 명령 출력을 찾습니다.

정렬한 후 삭제할 명령 출력을 찾습니다.

경로의 특정 패턴을 기반으로 일부 파일을 찾고 싶습니다. 그런 다음 해당 패턴의 최신 파일 3개와 삭제하려는 다른 파일만 유지하고 싶습니다.

답변1

그리고 zsh:

echo rm -f ./**/*pattern*(.Dom[4,-1])
  • **/모든 수준의 하위 디렉터리
  • (...)glob 한정자는 다른 기준에 따라 일치 항목을 제한합니다.
  • .:일반 파일만 해당
  • D: 도트 파일(숨겨진 파일)을 포함하고 숨겨진 디렉터리를 봅니다.
  • om: 수정 시간을 기준으로 정렬(최신 항목부터 오래된 항목 순)
  • [4,-1]: 4번째부터 마지막 까지 (따라서 처음 3개는 생략)

echo( 실제 실행을 위해 삭제됨 )

POSIX 셸 및 이에 상응하는 GNU 유틸리티를 사용하려면 다음을 수행하세요.

(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
  sort -zrn |
  tail -zn +4 |
  cut -zd/ -f2- |
  xargs -r0 echo rm -f)

echo( 실제 실행을 위해 삭제됨 )

이전 버전의 GNU 유틸리티를 사용하면 다음을 수행해야 할 수 있습니다.

(export LC_ALL=C
find . -name '*pattern*' -type f -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  tail -n +4 |
  cut -d/ -f2- |
  tr '\n\0' '\0\n' |
  xargs -r0 echo rm -f)

답변2

글쎄, 정렬에는 그에 대한 논리가 필요하지만 지금까지는 다음과 같습니다.

# 찾으려는 파일이 포함된 배열을 만듭니다.
파일=$(${PATH_TO_FOLDER} 찾기 -f 유형 -이름 "whatever.whatever")
# 배열의 전체 크기를 구합니다
총 크기=${#FILES[@]}
# 전체 크기에서 3을 빼서 임계값을 만듭니다.
중지=((${totalSize}-3))
# 카운터를 0으로 선언
카운터=0
# 배열의 파일을 하나씩 반복합니다.
"${FILES[@]}"에 있는 파일의 경우
하다
   # 3개의 파일이 남을 때까지 꼭 해주세요
   while [ ${counter} -le ${stopat} ]
   하다
      rm -v ${파일}
      ((카운터++))
   완벽한
완벽한

또는 등 -name의 확장된 표현을 사용할 수 있습니다 .*.shhello*.sh*hello.sh

위 명령은 3을 제외한 모든 파일을 삭제합니다. 이 명령을 사용하여 sort필요에 따라(크기, 생성 또는 수정 날짜 사용) 파일을 정렬하십시오.

FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")

관련 정보