특정 검색에는 찾기 작업을 사용할 수 없습니다.

특정 검색에는 찾기 작업을 사용할 수 없습니다.

특정 파일 세트의 크기를 나열하기 위해 명령 을 사용하려고 하는데 find출력이 표시되지 않습니다. 내가 사용하는 명령은 다음과 같습니다

find POD -type f -name *.mp3 -or -name *.ogg -ls

출력이 생성되지 않습니다. 하지만:

find POD -type f -name *.mp3 -or -name *.ogg

출력을 생성하는 경우 다음도 시도했습니다.

-printf "%p %k KB\n"
-exec ls -ls '{}' \;
-print0

그러나 이들 모두에는 출력이 없습니다. 예를 들어 다음과 같은 다양한 표현에서 이러한 작업을 사용할 때:

find . -maxdepth 1 -type f -printf "%p %k KB\n"

나는 또한 예상되는 결과를 얻습니다. 문제가 무엇인지 아시는 분 계신가요? 나는 뛰고있어:

Linux irimi 3.10.37-1-MANJARO #1 SMP Mon Apr 14 20:56:29 UTC 2014 x86_64 GNU/Linux

최신 Manjaro Linux 배포판이라고도 합니다. 내가 사용하는 쉘은 /bin/bashversion 입니다 4.3.8(1)-release.

SHELLOPTS내 환경 변수의 내용은 다음과 같습니다.

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

BASHOPTS환경 변수는 다음과 같습니다

cdspell:checkwinsize:cmdhist:complete_fullquote:dotglob:expand_aliases:extglob:extquote:force_fignore:histappend:hostcomplete:interactive_comments:nocaseglob:progcomp:promptvars:sourcepath

다시 한번 말씀드리지만, 이 문제를 디버깅하는 데 도움을 주시면 대단히 감사하겠습니다.

답변1

함정이 있다그리고/또는에 키워드가 있습니다 find. 작업( 예제에서는) or을 포함하여 아래의 모든 매개변수에 적용됩니다 . -ls없는(또는 추가된) 표현식은 and읽기 순서대로 평가되어 false로 끝납니다. 아니요.orandimplicit ()

따라서 이 명령은 다음을 find POD -type f -name *.mp3 -or -name *.ogg -ls의미합니다.

  • 파일 검색(POD 디렉터리에서 시작) --- 파일을 찾을 수 없는 경우: 중지
  • else(파일 발견)는 패턴 일치를 확인합니다 *.mp3 . --- 패턴이 일치하면 중지하세요! ( OR여기부터 적용되기 때문에 이전 명령이 실패한 경우에만 적용됩니다. (단, 이전 명령만 해당되고 이전 명령 그룹은 적용되지 않습니다.)

그리고 명령줄에 실행문( -ls, -exec, -print....)을 추가했기 때문에 암시적인 명령이 없으므로 -print1) 1)의 조건이 모두 true(파일 및 패턴 일치)이면 아무것도 실행할 필요가 없습니다. . 마지막 항목을 제거하면 각 조건부 분기 끝에 -ls암시적 배포가 발생합니다 .-print

  • 그렇지 않고 패턴이 일치하지 않으면 패턴과 일치하는 항목(파일/디렉터리) *.ogg을 검색하여 나열합니다(이것은 -ls조건부 명령이 아니며 이전 명령/테스트 "패턴이 true"인 경우에만 실행됩니다 *.ogg. 그러나 1 이후 ), 2)는 mp3가 아닌 파일에 대해서만 평가되며, 파일이 없으면 .ogg아무것도 표시되지 않습니다.

솔루션 1 각 논리적 분기에서 명령을 반복합니다.

   find POD -type f -name "*.mp3" -ls -or -name "*.ogg" -ls

솔루션 2(쉘 보호) 브래킷 추가

   find POD -type f \( -name "*.mp3" -ls -or -name "*.ogg" \) -ls

노트 현재 디렉터리에서 셸 패턴 평가를 방지하려면 패턴을 보호해야 합니다.

답변2

나는 이것이 평가 순서(명확한 우선순위 부족) 때문이라고 생각합니다.

-name '*.mp3' -o -name '*.ogg' -ls

그러면 -name '*.ogg'평가 결과가 false 이면 ls작업이 수행되지 않습니다. 괄호를 사용하여 OR 표현식을 그룹화하면 원하는 동작을 얻을 수 있습니다. 예를 들어 다음과 같습니다.

$ ls tests
file1.mp3  file2.mp3  file3.mp3

그 다음에

$ find tests \( -name '*.mp3' -o -name '*.ogg' \) -print
tests/file3.mp3
tests/file1.mp3
tests/file2.mp3

하지만

$ find tests -name '*.mp3' -o -name '*.ogg' -print

출력이 생성되지 않습니다. 알아채다

$ find tests -name '*.mp3' -o -name '*.ogg'

암묵적으로 다음과 같이 취급되기 때문에 특별한 경우입니다.

$ find tests \( -name '*.mp3' -o -name '*.ogg' \) -print

find또한 쉘이 확장되는 것을 방지하기 위해 명령에서 쉘 전역 변수를 인용하거나 이스케이프하는 것이 좋습니다 . NON-BUGS찾기 매뉴얼 페이지의 섹션을 참조하십시오.

관련 정보