파일 만들기
touch a1.txt a2.txt a3.txt
touch s1.mp3 s2.mp3 s3.mp3
그럼 내가 할게
find . -name "*.txt" -or -type f -print
그리고 왜 파일 s1.mp3
s2.mp3
s3.mp3
이 표시되지 않습니까 ?.txt
답변1
연산자 우선순위로 인해:절대적인AND 사이의 AND( )는 -a
OR( )보다 우선순위가 높습니다.-type f
-print
-o
find . \( -name "*.txt" \) -or \( -type f -print \)
당신이 원할 수도 있지만
find . \( -name "*.txt" -or -type f \) -print
모든 파일을 인쇄합니다.
답변2
우선순위 지정은 답의 절반에 불과합니다. 중요한 것은 부울 표현식 완성 규칙이 작동하는 방식입니다. 이것은 find
합리적인 기본값을 사용하고 동시에 프로그래밍이 가능하기 때문에 약간 복잡해집니다 .
내가 의미하는 바를 설명하기 위해 여기에 또 다른 해결책이 있습니다.
find . -name "*.txt" -print -or -type f -print
이것은 명확한 것을 추가합니다행동끝까지. 오직:
]# find -name "*.txt" -or -type f
./p.txt
./s1.mp3
./a1.txt
또한 모든 파일을 가져옵니다(일반적이지 않은 "p.txt" 항목 포함). 여기서 기본값은 -print
(하위) 표현식 외부에 있으며 모든 분기에 적용됩니다.
정확히 하나만 추가하면 -print
"either...or"가 표시됩니다.
]# find -name "*.txt" -print -or -type f
./p.txt
./a1.txt
]# find -name "*.txt" -or -type f -print
./s1.mp3
어느 것이 더 낫다고 논쟁할 필요는 없습니다. 문제는 Q가 매우 인위적이며 반복적이라는 것입니다. 를 추적하려는 경우 mkfifo pipe.txt
"OR" 대신 논리적인 "AND NOT"이 의미론적으로(그리고 전체적으로) 더 의미가 있습니다.
이를 위해서는 괄호나 -print가 필요하지 않습니다.
]# find -name "*.txt" -not -type f
./p.txt