디렉터리에서 최신 파일을 가져옵니다.

디렉터리에서 최신 파일을 가져옵니다.

Bash 스크립트에서는 다음 명령을 사용하여 특정 디렉터리에서 최신 백업 파일을 가져옵니다.

find /mnt/synology/bk/ -maxdepth 1 -name 'bk-*' -mmin -60 -print0 | xargs -0 ls -1 -t 2>/dev/null | head -n 1

파일을 찾을 수 없으면 명령은 현재 디렉터리(명령이 실행된 위치)에 있는 파일을 반환합니다.

일치하는 파일이 없으면 빈 출력을 반환할 수 있습니까?

감사해요

답변1

xargs의 -r 옵션을 사용해 보십시오.

-r, --no-run-if-empty
               If the standard input does not contain any nonblanks, do not run the command.  Normally, the command is run once even if there is no input.  This option is a GNU extension.

답변2

일부 BSD를 제외하고 입력이 비어 있으면 xargs cmd인수 없이 한 번만 실행됩니다. cmdGNU xargs(도 도입됨 -0)에는 -r이를 방지할 수 있는 옵션(현재 일부 다른 구현에서도 지원됨)이 있습니다.

이제 귀하의 접근 방식에는 몇 가지 다른 문제가 있습니다.

  • 파일 수가 많은 경우 여러 번 xargs실행되므로 ls -t최신 파일을 가져오지 않고 첫 번째 배치의 최신 파일만 가져옵니다.
  • 이러한 파일 중 하나라도 해당 유형인지를 의미하는 -d옵션을 전달 하지 않습니다.ls목차, 해당 내용이 나열됩니다.
  • 임의의 파일 이름을 처리할 수 있는 -print0/를 사용하고 있지만 더 이상 NUL로 구분된 파일 목록을 출력하지 않기 위해 이를 사용하면 손상됩니다.xargs -0ls -t

여기서는 zsh다음을 사용할 수 있습니다.

newest=(/mnt/synology/bk/bk-*(Nmh-1om[1]))
if (($#newest)); then
  printf 'Newest: %s\n' $newest
else
  echo none found
fi

또는 GNU를 사용하고 find(아마도 -maxdepthGNU -mmin확장을 사용하고 있을 것입니다) // sort구현은 입력에서 NUL 문자를 지원합니다.cuthead

find /mnt/synology/bk -mindepth 1 -maxdepth 1 \
                      -name 'bk-*' -mmin -60 -printf '%T@/%p\0' |
  tr '\n\0' '\0\n' |
  sort -rn |
  cut -d/ -f2- |
  head -n1 |
  tr '\0' '\n'

(그러나 반대의 경우와는 달리 zsh다음 부분에 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 경우 find일부 파일을 찾지 못할 수도 있습니다 .)bk-*bk-

관련 정보