파이프 입력에서 존재하지 않는 파일 인쇄

파이프 입력에서 존재하지 않는 파일 인쇄

많은 파일이 포함된 .PDF디렉토리 가 있습니다 .JPG.

.JPG.PDF각 파일에는 동일한 이름의 파일이 있어야 합니다 . 파일이 없는 파일을
찾기 위해 명령을 사용하려고 합니다 ..PDF.JPG

내 현재 명령은 다음과 같습니다

find -iname '*.jpg' -print0|sed 's/jpg$/pdf$/ig' |xargs -0 ls

그러면 : No such file or directory파일이 존재하지 않는다는 오류가 인쇄됩니다.
문제가 있거나 ls처리할 수 없다는 오류가 인쇄됩니다. 다음 중 어느 것이든 내 문제를 해결할 것입니다. grepsed

  • 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 파일은 에코됩니다.

관련 정보