2012-10-22 5 views
6

파일 이름에서 디렉토리를 생성하고 이동 나는 내가 처음에 최대 파일 이름의 첫 번째 부분을 기준으로 일련의 디렉토리를 생성하고자하는 파일bash는

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

의 부하가 '.'

BR0200 
BR210 
W0210 

해당 파일을 올바른 디렉토리 (즉, 모든 BR0200. * 파일을 BR0200 디렉토리로 이동)로 이동하십시오.

나는 bash 스크립트에서 찌르다가 있지만 오류가 계속 발생합니다. 모든 조언을 기꺼이 받아 들일 것입니다.

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

죄송합니다. 기본 질문 인 경우 죄송합니다. 웹 검색을 시도했지만 결과가 없습니다.

+0

무엇을 의미합니까? –

+0

@owlstead globbing은 쉘이 제공해야하는 가장 유용한 기능 중 하나입니다. – jordanm

+0

@jordanm 당신은 당연히 의견을 삭제하고 있습니다. –

답변

6

과제에서 = 주변에는 공백이 허용되지 않습니다.

dir="${file%%.*}" 

반대로, 공백은 테스트에 필요한이다. 당신이 if 문 제거 할 수 있도록

if [ -e $dir ]; then 
    ^ ^

는 지금까지 문체 개선으로, 그것은, 불필요한 mkdir -p 할 다치게하지 않습니다.

할당시 따옴표가 필요하지 않으므로 dir= 행에서 따옴표를 삭제할 수 있습니다. 따옴표는 다른 곳의 좋은 생각이므로 다른 따옴표는 삭제하지 마십시오.

.*을 for 루프에 추가하는 것이 좋습니다. 그렇게하면 스크립트를 두 번 이상 실행하면 새로 만든 하위 디렉토리를 이동하지 않습니다. 그리고 깔끔한 트릭 (반드시 개선은 아님)은 BR*.* W0*.*에서 {BR,W0}*.*으로 줄이는 것입니다.

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

당신이 뭔가를 시도 할 수 있습니다 :

BR의 *에서 파일 WO *; 는 DIR = $ 않습니다 ($ {파일} 에코 |.. AWK의 -F를 OFS = '{$ 1 인쇄}')

을 수행 에서 mkdir $ dir을 MV $ 파일 $ dir을 을 나는 비슷한 상황을했고이 일 나를 위해.