이 코드를 어떻게 더 짧게 만들 수 있나요?

이 코드를 어떻게 더 짧게 만들 수 있나요?

이 코드를 더 짧게 만드는 방법을 알려주십시오.

find /home/peace/* -iname "*.pdf" -exec pdfgrep -i yello {} \; -exec cp {} /home/peace/Desktop/yello \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i green {} \; -exec cp {} /home/peace/Desktop/green \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i blue {} \; -exec cp {} /home/peace/Desktop/blue \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i grey {} \; -exec cp {} /home/peace/Desktop/grey \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i black {} \; -exec cp {} /home/peace/Desktop/black \;
find /home/peace/* -iname "*.pdf" -exec pdfgrep -i white {} \; -exec cp {} /home/peace/Desktop/white \;

답변1

그리고 zsh:

#! /bin/zsh -
cd /home/peace || exit
set -o extendedglob # for (#i)
pdf=(*.(#i)pdf(.ND)) # all pdf files case insensitive, including hidden ones
                     # in the current directory, only considering regular files.
colors=(yello green blue grey black white)

(($#pdf)) || exit 0 # exit with success if there's no pdf file (job already done)

ret=0
for color ($colors) {
  files=(${(0)"$(pdfgrep -ilZe $color -- $pdf)"}) # all files containing the color
                                                  # using NUL-delimited records
  if (($#files)) { # some files were found
    mv -i -- $files Desktop/$color/ || ret=$? # move them, record failures
    pdf=(${pdf:|files}) # remove the files from the list as we've moved them
  }
}
exit $ret

이렇게 하면 호출 횟수와 pdfgrep디렉터리 읽기 횟수가 최소화됩니다./home/peace

답변2

개선의 여지가 좀 보입니다.

  • find의 첫 번째 매개변수는 디렉터리이며 끝에 "*"가 있는 경로는 아닙니다.

  • find는 하위 디렉터리 내에서 검색하므로 "find"가 하위 디렉터리에서 검색되지 않도록 제한하려고 합니다(find 인수 "-maxlength 1").

  • "something.pdf"라는 디렉토리가 있는 경우 결과가 마음에 들지 않을 수 있으므로 검색 결과를 파일로 제한하십시오(매개변수 "-type f" 찾기).

  • cp /home/peace/Desktop/yello의 두 번째 매개변수는 결과 파일 이름인가요? 그러나 pdfgrep이 여러 PDF 파일에서 "yello"를 찾을 수 있는 경우 올바른 결과는 무엇입니까? "/home/peace/Desktop/yello"가 디렉터리인 경우 끝에 "/"를 추가해야 합니다. 그래서 저는 이것이 우리가 결과 파일을 넣는 디렉토리라고 생각합니다.

그럼 시작해 보겠습니다.

find /home/peace/ -maxdepth 1 -type f -iname "*.pdf" -exec sh -c '
  for f do
    for i in yello green blue grey black white; do
      pdfgrep -iqe "$i" "$f" &&
        cp -f "$f" "/home/peace/Desktop/$i/"
    done
  done' sh {} + 

결과 디렉터리가 존재하는지 확인하기 위해 검사를 추가할 수도 있습니다.

관련 정보