/dirA/file, /dirB/file 중 마지막으로 수정된 파일 중 가장 큰 파일 찾기

/dirA/file, /dirB/file 중 마지막으로 수정된 파일 중 가장 큰 파일 찾기

마지막 수정 사항을 제외하고는 완전히 동일한 PDF 파일인 dirA 및 dirB라는 두 개의 디렉토리가 있다고 가정합니다.

각 파일 이름(항상 dirA, dirB에 있다고 가정)을 검색하고 각 파일 이름에 대해 어떤 파일(dirA/file 또는 dirB/file)이 마지막 수정 시간이 더 큰지 출력할 수 있는 bash 스크립트(awk 없음)는 무엇입니까? 예를 들어

if dirA/file.lastmodified > dirB/file.lastmodified 
##take action

답변1

GNU 통계 사용:

shopt -s dotglob

for file in dirA/*; do
    [[ -f "dirB/${file##*/}" ]] || continue
    if (( "$(stat -c %Y "$file")" > "$(stat -c %Y "dirB/${file##*/}")" )); then
        # take action
    fi
done

답변2

Bash, ksh, zsh 및 ash에도 한 파일이 다른 파일보다 최신인지 테스트하기 위한 내장 -nt연산자 [(및 bash/ksh/zsh 구성 )가 있습니다.[[ … ]]

for x in dirA/*; do
  y=dirB/${x#*/}
  if [ "$x" -nt "$y" ]; then
    # The file in dirA is more recent
  elif [ "$y" -nt "$x" ]
    # The file in dirB is more recent
  else
    # The two files have the same modification time
    # or the file doesn't exist in dirB
  fi
done

답변3

GNU 도구를 사용하여 가능한 솔루션:

find dirA dirB -type f -printf '%T@/%p\0' |
  tr '\n\0\t/' '\0\n/\t' |
  sort -k3 -k1,1rg |
  uniq -f2 |
  cut -f2- |
  tr '\0/\t' '\n\t/'

dirA 및 dirB(및 해당 하위 디렉터리)의 모든 파일이 보고되지만 두 파일이 공통인 경우 최신 파일만 보고됩니다(또는 두 파일이 동일한 경우 무작위로 보고됨).

이는 와 같은 dirA값 에만 적용됩니다 . 즉, 공백이나 슬래시 문자를 포함하지 않지만 포함할 수 있는 파일 경로에는 제한이 없습니다.dirB"dirA"

를 사용하면 -type f일반 파일만 보고됩니다(symlink, fifo, 장치...는 보고되지 않음).

find-printf, g정렬 유형, uniq의 옵션 및 NUL 문자 를 -f처리하는 기능은 GNU에만 적용됩니다.sortuniqcut

관련 정보