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
인수 없이 한 번만 실행됩니다. cmd
GNU xargs
(도 도입됨 -0
)에는 -r
이를 방지할 수 있는 옵션(현재 일부 다른 구현에서도 지원됨)이 있습니다.
이제 귀하의 접근 방식에는 몇 가지 다른 문제가 있습니다.
- 파일 수가 많은 경우 여러 번
xargs
실행되므로ls -t
최신 파일을 가져오지 않고 첫 번째 배치의 최신 파일만 가져옵니다. - 이러한 파일 중 하나라도 해당 유형인지를 의미하는
-d
옵션을 전달 하지 않습니다.ls
목차, 해당 내용이 나열됩니다. - 임의의 파일 이름을 처리할 수 있는
-print0
/를 사용하고 있지만 더 이상 NUL로 구분된 파일 목록을 출력하지 않기 위해 이를 사용하면 손상됩니다.xargs -0
ls -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
(아마도 -maxdepth
GNU -mmin
확장을 사용하고 있을 것입니다) // sort
구현은 입력에서 NUL 문자를 지원합니다.cut
head
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-