2014-06-16 4 views
7

OS 리눅스 민트찾아 제목이 마침내 찾아 디렉토리에있는 모든 이미지를 복사 할 것이라고 말했습니다처럼 구문

을 이해하려고 노력 터미널 리눅스 민트를 사용하여 디렉토리에있는 모든 이미지를 복사합니다.

내가 발견

이 디렉토리에 ALLS JPG (또는 JPG) 파일을 찾아 폴더/홈/킴/neu2에 복사 :

find . -iname \*.jpg -print0 | xargs -I{} -0 cp -v {} /home/joachim/neu2 

발견 모든 이미지 파일은 디렉토리에 있습니다 :

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' 

제 문제는 무엇보다도 먼저 구문을 이해하지 못합니다. 누군가 코드를 설명 할 수 있습니까? 사전에)

인사와 감사,

그리고 두 번째는 누군가가 내가 원하는 것을 수행하는 코드를 생성하는 두 개의 코드를 연결할 수 있습니다!

다시 코드 설명이 도움이 될 것입니다.

답변

15

먼저 파이프 "|" links 명령은 첫 번째 매개 변수의 출력을 두 번째 매개 변수로 인수로 전달합니다. 두 개의 쉘 코드는 모두 find 명령의 출력을 다른 명령 (grep 및 xargs)으로 파이프합니다. 의 그 명령에 차례로 살펴 보자 :

첫 번째 명령은 :

발견 (즉 발견의 매뉴얼 페이지에서 설명입니다) "디렉토리 계층 구조에서 파일을 검색"할 수있는 프로그램입니다 찾을 수 있습니다. 구문은 (이 경우)

find <search directory> <search pattern> <action> 

두 경우 모두 검색 디렉토리는 다음과 같습니다. (즉, 현재 디렉토리). 현재 디렉터리뿐만 아니라 모든 하위 디렉터리 (디렉터리 계층 구조)도 검색한다는 점에 유의하십시오.

검색 패턴은 -name (이 옵션에 대한 인수로 주어진 패턴과 일치하는 이름의 파일을 검색하는 것을 의미) 또는 -iname (이름과 동일하지만 대소 문자를 구분 함)과 같은 옵션을 허용합니다.

동작 패턴은 -print0 (지정된 검색 디렉토리에서의 위치를 ​​포함하여 정확한 파일 이름 인쇄, 즉 파일에 대한 상대 또는 절대 경로) 또는 -exec (파일에서 주어진 명령 실행, 명령은 ";"로 끝나야하고 "{}"의 모든 인스턴스는 파일 이름으로 대체됩니다.

즉, (파이프의 왼쪽 첫 번째 부분) 최초의 쉘 코드

find . -iname \*.jpg -print0 

검색 현재 디렉토리 계층 구조에서 ".JPG"를 종료하고 자신의 경로와 이름을 인쇄를 가진 모든 파일.두 번째 (첫 번째 부분)

find . -name '*' -exec file {} \; 

현재 디렉토리 계층 구조에있는 모든 파일을 찾아 그들을

file <filename> 

을 실행합니다. File은 파일 유형을 결정하고 인쇄하는 다른 명령입니다 (자세한 내용은 man 페이지를 참조하십시오. man 파일).

번째 명령은 : xargs를로 파이프되어 찾기 출력으로부터

xargs를 "구축하고 표준 입력 exectues 명령 라인"(사람 xargs를)하는 명령이다, 즉 xargs 명령. 이 빌드 및 실행하는 명령은이 경우 대체 문자열 명령에 파일에서 얻는 입력으로 대체 할 수 있습니다 {}의 즉 모든 인스턴스 (즉

cp -v {} /home/joachim/neu2" 

옵션 -I {} 정의합니다 , 파일 이름). 옵션 -0은 입력 항목이 공백 문자 나 개행 문자로 종료 (분리)되지 않고 null 문자로만 정의됨을 정의합니다. 이것은 xargs 입력으로 find 출력을 처리하는 표준 방법을 사용할 때 필요합니다.

빌드되고 실행되는 명령은 물론 -v (자세한 정보) 옵션이있는 복사 명령이며 find에서 가져온 각 파일 이름을 디렉토리로 복사합니다.

셋째 명령 그렙

그렙는 입력 만 특정 출력 패턴과 일치하는 선 또는 문자열을주는 필터. -o 옵션은 전체 행 (man grep 참조)이 아닌 일치하는 문자열 만 인쇄하도록 grep에 지시합니다. -P는 다음 패턴을 perl 정규 표현식 패턴으로 해석하도록 지시합니다. 펄 정규식에서 ^는 라인의 시작이다. +는 임의의 문자열이다.이 임의적으로 콜론, 스페이스, 영숫자 (펄 정규 표현식에서 \ w +로 표시), 공백 및 문자열 "영상". 기본적으로이 grep 명령은 파일 출력을 필터링하여 이미지 파일 인 파일 이름 만 출력합니다.

당신이 실제로 당신이 (1) 이미지 파일을 나열하는 두 번째 쉘 명령의 출력을 (취하고 싶은 이제 어떻게

를 원 명령 : (http://www.comp.leeds.ac.uk/Perl/matching.html 여기 예를 들어 정규식의 펄 읽기에 대한)), (2) 적절한 형식으로 가져오고 (3) 첫 번째 쉘 명령 행에서 xargs 명령으로 파이프합니다 (그러면 원하는 복사 명령을 빌드하고 실행합니다). 그래서 이번에는 두 개의 파이프가있는 3 개의 (실제로는 4 개의) 무대 쉘 명령이 있습니다. 문제가 아니다. 우리는 이미 스테이지 (1)과 (3)을 가지고 있습니다. (스테이지 (3)에서는 입력이 더 이상 출력을 찾지 못하기 때문에 -0 옵션을 생략 할 필요가 있습니다; 개행자를 아이템 분리 자로 취급해야합니다).

(2) 단계가 여전히 누락되었습니다. 이를 위해 cut 명령을 사용하는 것이 좋습니다. 잘라내 기는 문자열을 변경하여 여러 필드 (원래 문자열의 구분 기호 문자로 구분)로 분리 한 다음 다시 배열 할 수 있습니다. 구분 문자로 ":"를 선택합니다 (이 옵션은 grep 출력의 파일 이름을 끝내고 -d ':'옵션을 사용합니다). 첫 번째 필드를 지정하도록 지시합니다 (옵션 -f1, essentialls : 파일 이름 만 인쇄하십시오. ":"뒤에 오는 부분), 즉단계 (2) 다음

cut -d':' -f1 

것입니다 그리고 당신이 원하는 전체 명령은 될 것입니다 : http://www.linuxmanpages.com

+0

정말 고마워요! 귀하의 답변에는 많은 정보가 포함되어있어서 모든 것을 훨씬 더 잘 이해할 수 있습니다. – newandlost

+0

그리고 명령을 이해하는 데 얼마나 많은 도움이되는지는 미친 짓입니다. – newandlost

+0

"... 또는 -exec (파일에서 주어진 명령을 실행하면 명령은"; "..."으로 끝납니다. 실제로 \를 의미합니까, 아니면 왜입니까? there \? – newandlost

0

I : 당신이 여기 예를 들어 모든 사람이 페이지를 찾을 수 있습니다

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2 

find . -name '*' -exec file {} \; | 
awk '{ 
    if ($3=="image"){ 
     print substr($1, 0, length($1)-1); 
     system("cp " substr($1, 0, length($1)-1) " /home/joachim/neu2") 
    } 
}' 

substr ($ 1, 0, len) 명령을 알아 냈습니다. 첫 번째 열 파일에서 name을 반환하기 때문에 gth ($ 1) -1)이 필요합니다.

0

위의 대답은 정말 좋습니다. 거대한 디렉토리라면 더 오래 걸릴 수 있습니다. 여기에 파일 확장자를 이미 알고있는 경우 짧은 버전입니다.

find . -name \*.jpg | cut -d':' -f1 | xargs -I{} cp --parents -v {} ~/testimage/