많은 파일이 포함된 .PDF
디렉토리 가 있습니다 .JPG
.
.JPG
.PDF
각 파일에는 동일한 이름의 파일이 있어야 합니다 . 파일이 없는 파일을
찾기 위해 명령을 사용하려고 합니다 ..PDF
.JPG
내 현재 명령은 다음과 같습니다
find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls
그러면 : No such file or directory
파일이 존재하지 않는다는 오류가 인쇄됩니다.
문제가 있거나 ls
처리할 수 없다는 오류가 인쇄됩니다. 다음 중 어느 것이든 내 문제를 해결할 것입니다. grep
sed
ls
존재하지 않는 파일만 나열하는 방법은 무엇입니까 ?- /filter
ls
/sed
오류를 처리하는 방법은 무엇입니까grep
? - bash 스크립트 파일을 생성하지 않고 파일 존재를 확인하는 다른 방법이 있습니까?
답변1
루프를 사용해야한다고 생각합니다
IFR=$'\0' # because you use -print0 on your find
for jpg_file in `find -iname '*.jpg' -print0`
do
pdf_file=`echo "$jpg_file" | sed 's/jpg$/pdf/i'`
if [ -e "$pdf_file" ]; then
echo "$pdf_file exist"
else
echo "$pdf_file missing"
fi
done
답변2
POSIXly에서는 다음과 같이 할 수 있습니다.
find . -name '*.[jJ][pP][gG]' -exec sh -c '
for i do
[ -e "${i%.*}.pdf" ] || printf "%s\n" "$i"
done' sh {} +
PDF 파일을 대소문자를 구분하지 않고 검색하려면 다음을 수행하십시오.
find . -name '*.[jJ][pP][gG]' -exec sh -c '
for i do
set -- "${i%.*}".[pP][dD][fF]
case $1 in
(*"]") printf "%s\n" "$i"
esac
done' sh {} +
답변3
zsh를 사용하여,
setopt extendedglob
print -rl -- **/*.(#i)jpg(e{'[[ ! -e $REPLY:r.pdf ]]'})
해당 파일 jpg
이 없는 파일은 보고됩니다 .pdf
PDF
고려 하고 제출 하고 싶다면 PdF
:
print -rl -- **/*.(#i)jpg(e{'f=($REPLY:r.(#i)pdf(N)); ((!$#f))'})
물론 인쇄하는 대신 다음과 같이 반복할 수 있습니다.
for f (**/...) convert $f $f:r.pdf
:r
주어진루트 이름(즉, 확장자 없음) 파일 이름( csh
레거시), (#i)
대소문자를 구분하지 않는 와일드카드가 설정된 경우( extendedglob
켜진 경우) 파일에 와일드카드를 사용해야 하는지 결정하기 위해 e{some code}
와일드카드 한정자가 실행됩니다 .some code
숨겨진 파일(이름이 점으로 시작하는 파일)을 건너뜁니다. D
다시 추가하려면 와일드카드 한정자를 추가하세요 .
답변4
이는 다음 사항에 도움이 될 것입니다.
find . -iname '*.pdf' -exec bash -c '[[ -f $(echo $(echo {}|sed "s/pdf/jpg/")) ]] || echo $(echo {}|sed "s/pdf/jpg/") not found' \;
해당 JPG 파일이 없는 PDF 파일은 에코됩니다.