2017-12-01 5 views
-2

특별히 명확하지 않은 사항이 있으면 알려 주시면 최대한 자세히 알려 드리겠습니다.파일 이름의 패턴에 따라 파일을 특정 디렉토리로 이동시키는 방법은 무엇입니까?

기본적으로 확장명과 패턴과 일치하는 디렉토리 및 하위 디렉토리에 다양한 확장자 및 유사한 패턴의 파일 세트를 파일 이름으로 정렬해야합니다. #### 1 900까지의 숫자입니다 패턴 "ZZ ####"로 시작하는,

  1. 모든 파일 확장자에 관계없이;

    조금 정교한하려면 "zz1.zip부터 zz950.zip, zz1.mov부터 zz950.mov, zz1.mp4부터 zz950.mp4까지"

  2. 일부 파일에는 추가 문자가 들어 있습니다. "zz360_hello_world.zip"

  3. 일부 파일에는 공백이 있습니다. "/ 홈/인사/zz1/우편/홈/인사/zz1/VID"

  4. : "zz370_hello world.zip는"

  5. 나는이 파일을 분류하고 특정 형식 다음 디렉토리 및 하위 디렉토리로 이동해야

  6. 디렉터리 및/또는 하위 디렉터리가 없으면 만들어야합니다.

예 :

zz400_testing.zip  ----> /home/hello/zz400/zip 
zz400 testing video.mov ----> /home/hello/zz400/vid 

zz500.zip      ----> /home/hello/zz500/zip 
zz500_testing another video.mp4 ----> /home/hello/zz500/vid 

나는 주변의 간단한 사용 사례에 대한 몇 가지 답을 찾았지만 내 특정 요구에 대한 작업 아무 것도 얻을 수 없습니다.

아무런 도움이되지 않을 경우 대단히 감사하겠습니다.

감사합니다.

편집 :

for f in *.zip; do 
    set=`echo "$f"|sed 's/[0-9].*//'` 
    dir="/home/demo/$set/photos" 
    mkdir -p "$dir" 
    mv "$f" "$dir" 
done 

와 나는 장난 봤는데 코드를 추가 난 그냥 정규식과 일치하는 방법 주위에 내 머리를 포장하는 데 문제라고 생각한다. 나는 그것으로 지금까지이있어 :

[[email protected] grep]$ echo zz433.zip|sed 's/[0-9].*//' 
zz 

스크립트는 MKDIR을 실행, 심지어 자신의 적절한 위치로 zip 파일을 이동합니다. 난 그냥 적절한 최상위 디렉토리 (zz433)를 만들 수 없습니다.

+0

코드는 어디에 있습니까? 너 뭐 해봤 니? 'mkdir'은 디렉토리를 만들고, 와일드 카드를 사용하여'ls'를 선택하거나'find'도 그렇게 할 수 있습니다.'mv'는 파일을 움직이게하고, 파일을 반복 할 필요가 있다면'for'를 사용하고'for'는 사용하지 않습니다. 'for '는 공백을 올바르게 처리하지 않습니다. 그것을 시도해보십시오, 여기에 문제가 있다면 앞으로 나아갈 수 있도록 도와 드리겠습니다. – Nic3500

+0

@ Nic3500 사과, 나는 관련 정보를 가진 나의 포스트를 편집했다. 나는 이걸로> _ < – whybashwhy

답변

0

여기 sed 명령을 달성하기 위해 노력하고 무엇을하지 않습니다

set=`echo "$f"|sed 's/[0-9].*//'` 

정규 표현식 [0-9].*의 의미는 "아무것도 다음에 숫자"입니다. s/// 명령이 sed 인 경우 대체가 수행됩니다. 결과는 첫 번째 숫자부터 입력에서 모든 것을 효과적으로 제거합니다. "zz360_hello_world.zip"의 경우 "3"부터 시작하여 "zz"만 남기는 을 모두 제거합니다.

파일을 일치 시키려면 *.zip 패턴이 설명과 일치하지 않습니다.당신은 당신이 번호를 포함 괜찮다면 "ZZ"및 900까지 1의 숫자로 시작하는 파일을 찾고> (900) 당신은 루프 같은 표현 작성할 수 있습니다

for f in zz[0-9][^0-9]* zz[0-9][0-9][^0-9]* zz[0-9][0-9][0-9][^0-9]*; do 

또는 동일 더 조밀하게 물건 :

for f in zz{[0-9],[0-9][0-9],[0-9][0-9][0-9]}[^0-9]*; do 

이것은 glob 패턴이다. zz[0-9][^0-9]*은 "zz '로 시작하고 그 다음에 숫자가오고 그 뒤에 숫자가 나오고 그 뒤에 아무 것도 오는 것을 의미합니다". 위의 예에서 나는 "zz"다음에 1, 2 또는 3 자리가오고 그 뒤에 숫자가없는 경우를 다루기 위해 세 가지 패턴을 사용합니다. 두 번째 예는 더 컴팩트 한 형태의 첫 번째 예입니다. 은 abdacd으로 확장됩니다.

다음으로 적절한 접두어를 얻으려면 case 문과 패턴 매칭을 사용하고 하위 문자열을 추출 할 수 있습니다. 이러한 패턴의 구문은 for 문에있는 이전 예제와 동일한 glob 구문입니다.

case "$f" in 
    zz[0-9][0-9][0-9]*) prefix=${f:0:5} ;; 
    zz[0-9][0-9]*) prefix=${f:0:4} ;; 
    zz[0-9]*) prefix=${f:0:3} ;; 
esac 

파일 유형별로 그룹화를 만들 수도 있습니다. 도트까지 ext=${f##*.}으로 이름의 시작 부분을 절단하여 파일 확장명을 가져온 다음 앞의 예와 같이 case 문을 사용하여 원하는 디렉터리 이름에 확장명을 매핑 할 수 있습니다.

위의 함께 퍼팅 : 나는 내 자신의 질문의 일부를 대답했습니다

for f in zz{[0-9],[0-9][0-9],[0-9][0-9][0-9]}[^0-9]*; do 
    case "$f" in 
     zz[0-9][0-9][0-9]*) prefix=${f:0:5} ;; 
     zz[0-9][0-9]*) prefix=${f:0:4} ;; 
     zz[0-9]*) prefix=${f:0:3} ;; 
    esac 

    ext=${f##*.} 
    case "$ext" in 
     mov|mp4) group=vid ;; 
     *) group=$ext ;; 
    esac 

    dir="/home/demo/$prefix/$group" 
    mkdir -p "$dir" 
    mv "$f" "$dir" 
done 
-1

!

for f in *.zip; do 
    set=`echo "$f"|grep -o -P 'zz[0-9]+.{0,0}'` 
    dir="/home/demo/$set/photos" 
    mkdir -p "$dir" 
    mv "$f" "$dir" 
done 

기본적으로, 다음 스크립트 같은 파일을 사로 잡고 :

그런 다음
zz232.zip 
zz233test.zip 
zz234 test.zip 

는 최상위 디렉토리를 생성합니다 (ZZ ####), 사진 하위 디렉토리 및 이동 파일을 제자리에 넣기 :

/home/demo/zz232/photos/zz232.zip 
/home/demo/zz233/photos/zz233test.zip 
/home/demo/zz234/photos/zz234 test.zip 

추가 기능을 위해 스크립트를 확장하는 단계로 이동합니다.

감사합니다.

+0

내 대답을 보았 니? 그것은 질문에서 분열 된'sed'와 regex 이상을 해결하고 더 효율적으로이 해답을 얻습니다. – janos

+0

@ janos 나는 그것을했고, 고맙다! 솔직히 말해서, 나는 여기서 완전히 멍청한 사람이고, 당신의 대답은 완전히 내 머리 위로 기울지 않을 것입니다. – whybashwhy

+0

나는 내 대답에 대한 자세한 설명을 추가했습니다. 더 필요한 게 있으면 알려줘. – janos

0

방법에 대해 :이 도움이

#!/bin/bash 

IFS=$'\n' 

for file in *; do 
    if [[ $file =~ ^(zz[0-9]+).*\.(zip|mov|mp4)$ ]]; then 
     ext=${BASH_REMATCH[2]} 
     if [ $ext = "mov" -o $ext = "mp4" ]; then 
      ext="vid" 
     fi 
     dir="/home/hello/${BASH_REMATCH[1]}/$ext" 
     mkdir -p $dir 
     mv "$file" $dir 
    fi 
done 

희망.