2013-05-06 4 views
0

현재 나의 작업은 여러 디렉토리에있는 많은 파일을 다른 식별자의 이름으로 바꾸고 있습니다. 각 디렉토리 내에서 B01, B02, B03, 등 등 img01.23495.png, img01.3596596.png, img02.2399495.png,리눅스에서 경로와 파일명의 특정 부분을 추출하는 방법

등의 파일 이름입니다 :

그래서 내가 좋아하는 몇 개의 디렉토리가 b01의 img01 이름을 다른 식별자로 변경해야합니다. 따라서 식별자는 디렉토리 이름과 파일 이름의 첫 번째 부분에 따라 다릅니다.

파이프 라인에 대한 나의 생각은 다음과 같다 : 모든 png 파일 이름을 가져오고, 어떤 폴더인지 추출하고, img ## 부분을 추출하고, 정보를 파일에 저장한다. 그래서 나는 :

B01 img01
B01 img02
B02 img01
은 ...

이 그래서 나는 새로운 식별자가을 수행 할 수있는 다음 파일에서 읽은 세 번째 열으로 무엇인지 afterwords 지정할 수 있습니다 유용 실제 이름 바꾸기.

현재 경로는 ./images/something/b01/img01.2342394.png입니다.

내가 그러나 sed 부분에 붙어 나는 현재 find . | grep png | something sed | sort | uniq > indentifiers.txt

같은 것을 시도하고, 목록을 얻으려면. 또한 내가하려는 일을하는 제안은 환영 받는다.

+1

'find. -name "* .png"| sed의/^. * \/\ ([^ \ /] * \) \/\ ([^ \ /] * \) \. png $/\ 1 \ 2/| sort -u'? 이것은 반복을 통해 불필요한 것 같습니다. 이 모든 작업을 한 번에 수행하는 실제 스크립트 또는 함수를 작성하는 데 관심이 있으십니까? – FrankieTheKneeMan

+0

감사합니다. 나는 좋은 사이트가 정규 표현식에 대한 실험을하고, 정규 표현식을 find . -name "*.png" | sed 's/^.*\/\([^\/]*\)\/\(img[0-9][0-9]\)\([^\/]*\)\.png$/\1 \2/ | sort -u으로 수정했다. 반복을 통해 무엇을 의미합니까? – vsector

+0

나는 목록을 두 번 읽는 것이 불필요한 것 같다. – FrankieTheKneeMan

답변

1
find . -name "*.png" | sed 's#^.*/\([^/]*\)/\([^/.]*\)\.[0-9]\+\.png$#\1 \2#' | sort -u 

죄송합니다 그에서 전체 테스트를 얻을 수 없다 - 나는 일에있어 이상한 sed 문제가 OSX에 붙어. 어쨌든, 솔루션의 핵심은 find에 대한 -name 테스트와 sort에 대한 -u 플래그의 사용 외에 sed 정규 표현식입니다. 당신은 손잡이가있는 것처럼 보이지만 누군가가 그것을 발견하면 모든 것을 설명 할게요. :

s - Search and Replace 
    # - Delimiter (Search pattern) 
    ^- Beginning of a line 
    . - Any character 
    * - zero or more times 
    /- a literal '/' 
    \(- start a capturing group 
     [^/]* - Any character except '/', zero or more times 
    \) - End capturing group (#1) 
    /- a literal '/' 
    \(- start a capturing group 
     [^/.]* - Any character except '/' or '.', zero or more times 
    \) - End capturing group (#2) 
    \. - a literal '.' 
    [0-9] - a digit 
    \+ - one or more times 
    \.png - a literal '.png' 
    $ - end of the line 
    # - Delimiter, now starting the replace pattern 
    \1 - the contents of the first capturing group 
     - a space 
    \2 - the contents of the second capturing group 
    # - Delimiter. End of all patterns. 
+0

환상적인 도움에 감사드립니다! – vsector

관련 문제