grep에 조건부 OR을 도입하는 방법은 무엇입니까? 예를 들어 파일 형식(JPEG 또는 JPG)을 찾아 해당 파일만 Photos 폴더로 보냅니다. 예를 들어. 원하는 위치로 파일을 보내고 파일 형식을 얻는 방법을 알고 있습니다. grep 부분에 대한 도움이 필요합니다.
저는 OS X를 사용하고 있는데 *nix 유틸리티는 *nix 환경에서 익숙했던 것보다 더 수정/사용자 정의된 것 같습니다. 따라서 대답은 가능한 한 일반적이고 이식 가능하기를 바랍니다.
답변1
grep
이 옵션을 여러 번 사용하여 여러 정규식을 전달할 수 있습니다.-e
grep -e정규식 1-이자형정규식 2 입력 파일
일치하는 라인 일치regex1
또는regex2
.
답변2
또 다른 접근 방식은 다음과 같습니다.
grep "foo\|bar" /path/to/file
foo
이는 텍스트 나 bar
웹사이트 에서 확인할 수 있습니다.file
답변3
나는 또한 정규식에 대해 상당히 익숙하지 않지만 아무도 대답하지 않았으므로 시도해 보겠습니다. OR 연산자에는 파이프 연산자 "|"가 사용됩니다.
아래 정규식을 사용하면 어딘가에 도착할 것입니다.
.+((JPG)$|(JPEG)$)
(한 번 이상 일치하고 그 뒤에 "JPG" 또는 "JPEG"가 옴)
자세한 답변(일부 (e)grep을 알고 편집됨): 다음 파일이 포함된 폴더가 있다고 가정해 보겠습니다.
test.jpeg, test.JpEg, test.JPEG, test.jpg, test.JPG, test.notimagefile, test.gif
(이름이 별로 창의적이지 않네요...)
먼저, 패턴에 대해 우리가 알고 있는 것을 정의하는 것부터 시작합니다. 즉, 이름의 끝을 찾고 있다는 것을 알고 있습니다. 따라서 "$" 피연산자를 사용하여 각 줄이 정의된 패턴으로 끝나야 함을 정의합니다. 우리는 패턴이 JPEG 또는 JPG여야 한다는 것을 알고 있습니다. 이를 위해 파이프 "|"를 OR 피연산자로 사용합니다. 현재 모델은 다음과 같습니다.
((JPEG)|(JPG))$
("JPEG" 또는 "JPG"로 끝나는 모든 줄과 일치)
그러나 이 예에서는 유일한 차이점은 선택 사항인 "E"입니다. 이를 위해 "?" 피연산자(선택적 의미)를 사용할 수 있습니다. 우리는 쓴다:
(JP(E)?G)$
("J", "P", 선택적 "E", "G" 패턴으로 끝나는 모든 파일이 해당됩니다.)
그러나 파일 이름에 소문자를 포함하는 파일을 일치시키고 싶을 수도 있습니다. 이를 위해 문자 클래스 "[...]"를 소개합니다. 의미는 다음 중 하나와 일치합니다. 우리는 쓴다:
([jJ][pP]([eE])?[gG])$
(at 패턴으로 끝나는 모든 파일과 일치합니다. 예: "j" 또는 "J", "p" 또는 "P", 선택적 "e" 또는 "E", 그 뒤에 "g" 또는 " G") (grep에서 "-i" 옵션을 사용하여 수행할 수도 있지만 REGEX에서는 연습용으로 남겨두었습니다.)
마지막으로, 패턴이 보이기 시작했기 때문에 불필요한 괄호를 생략할 수 있습니다. 선택 문자("E")가 하나만 있으므로 이 문자는 생략할 수 있습니다. 또한 파일은 이 패턴으로만 끝나므로 여는 괄호와 닫는 괄호를 생략할 수 있습니다. 그래서 우리는 간단히 다음을 얻습니다:
[jJ][pP][eE]?[gG]$
마지막으로 ".gif" 파일 형식의 파일도 찾고 싶다고 가정하면 다음을 두 번째 매개변수로 추가할 수 있습니다.
([jJ][pP][eE]?[gG])|([gG][iI][fF])$
(여기서 다시 가독성/그룹화를 위해 추가 괄호를 추가했습니다. 혼란스러워 보이면 자유롭게 제거하세요.)
마지막으로 ls와 파이프를 사용하여 모든 파일 이름을 (e)grep으로 보냅니다.
ls | egrep '([jJ][pP][eE]?[gG])|([gG][iI][fF])$'
결과:
test.gif
test.JPG
test.JpEg
test.JPEG
test.jpg
test.JPG
두 번째 편집: -i 옵션을 사용하고 대괄호를 생략하면 다음과 같이 단축할 수 있습니다.
ls | egrep -i 'jpe?g|gif$'
답변4
file $file
파일을 실행하고 출력을 확인하여 파일 형식을 얻었습니까?
tk-mbp:~ tkennedy$ file share/rally.jpg
share/rally.jpg: JPEG image data, JFIF standard 1.01
아니면 파일 확장자를 보고 계시나요?
file 명령의 출력에서 실제 파일 형식을 보려면 다음을 수행하세요.
for file in $(find $dir -type f -exec file {} \; | grep JPEG | cut -d: -f1); do mv $file $photo_dir/ ; done
파일 확장자만 보고 있다면 다음에서 모든 작업을 수행할 수 있습니다 find
.
find $dir -type f -name \*jpg -o -name \*jpeg -o -name \*JPG -o -name \*JPEG -exec mv {} $photo_dir/ \;
grep에 여러 매개변수를 전달하는 방법을 알고 싶다면 Mac OS X에서 또는 를 사용하여 egrep
이를 수행할 수 있습니다.grep -E
find $dir | grep -E 'jpg|jpeg|JPG|JPEG'
등.