나는 이 조각을 가지고 놀았지만 find
내가 원하는 방식으로 작동하도록 할 수 없는 것 같습니다. Google을 사용해 보았지만 튜토리얼 중 어느 것도 이 상황을 해결하지 못하는 것 같습니다.
다음 파일이 있다고 가정 해 보겠습니다.
test-[done].mkv
test.mkv
test2.avi
test3.mp4
내가 원하는 것은 이름이 있는 항목을 제외하고 find
모두 선택하는 것입니다..mkv OR .avi OR .mp4
[done]
첫 번째 조건은 쉽게 해결할 수 있습니다.
find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) -print
하지만 두 번째 조건을 실행하는 데 문제가 있습니다.
find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( ! -name '*[done]*' \) -print
여전히 `test-[done].mkv가 표시됩니다.
test-[done].mkv
test.mkv
test2.avi
test3.mp4
가능한 한 많은 -name을 사용할 수 있다고 생각하여 정규식을 시도했지만 여전히 운이 없습니다.
[root@xxxx]# ls
test-[done].mkv test.mkv test2.avi test3.mp4
[root@xxxx]# find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\)$' \) -print
test-[done].mkv
test.mkv
test2.avi
test3.mp4
누구든지 이 문제를 해결하도록 도와줄 수 있나요? 감사해요!
답변1
귀하의 -name
버전에서는 이것이 ! -name '*[done]*'
필요 하지 않습니다 ! -name '*\[done\]*'
. 그렇지 않으면 대괄호 안의 문자를 문자 집합으로 처리하여 "d", "o", "n" 또는 "e" 문자가 포함된 모든 파일 이름을 제외합니다(귀하의 이름도 포함). )에는 "e"가 포함되어 있습니다). 그런 다음 모든 파일을 제외하는 대신 모든 파일을 포함하도록 조건을 두 번째로 무효화합니다. 그러나 수정된 버전은 다음과 같습니다.
find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) \( ! -name '*\[done\]*' \) -print
$
패턴 일치 직후에 정규식 버전이 잘못되었지만 [done]
실제 파일 이름의 해당 지점 이후에는 여전히 파일 확장자가 있지만 .*
이전에 추가하면 $
작동합니다.
find * \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) ! \( -regex '.*\(\[done\]\).*$' \) -print