zip 이름의 패턴을 기반으로 zip 파일을 디렉터리로 추출합니다.

zip 이름의 패턴을 기반으로 zip 파일을 디렉터리로 추출합니다.

다음 zip 파일이 있습니다.

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

그리고 각 zip을 다음 형식으로 적절한 디렉터리에 추출해야 합니다(기본적으로 처음 30자만 필요합니다).

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

이것은 현재 가지고 있는 명령으로 두 번째 zip 파일(PLP_634562_2004-03-02_02-15-07_UBIC.zip)에서만 작동합니다.

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

zip 파일의 처음 30자만 읽고 이를 기반으로 디렉터리를 생성하도록 변경하고 싶습니다. 이는 향후 새로운 zip 파일 명명 형식이 작동하도록 보장합니다.

나는 명령의 n 변수 부분을 이것으로 변경해 보았습니다.

n=$(echo ${f:0:30}); 

하지만 그건 효과가 없었어요. 저는 리눅스 배쉬를 사용하고 있습니다.

답변1

를 사용하면 sed처음 30자를 얻을 수 있습니다.

sed 's|\(.\{30\}\).*|\1|'

cut루프 대신에 그것을 사용하십시오 for.

해당 대체의 분석은 로 대체하는 sed것과 일치하는 것입니다 . ( 로 이스케이프 처리됨 ) 은 30개의 단일 문자( )로 계산됩니다.\( \)\1{30}\.

답변2

모든 제안에 감사드립니다. 모든 사람의 제안 중 일부를 가져와 이 명령을 만들었습니다. 제 경우에는 이것이 바로 제가 요구한 명령입니다.

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • 모든 zip 파일을 반복합니다.
  • 각 zip 파일을 에코합니다(파일 이름만, 크기나 경로와 같은 추가 정보는 표시되지 않음). 그런 다음 처음 30자만 표시하고 이를 n 변수에 저장합니다.
  • 그런 다음 각 zip 파일에 대한 콘텐츠를 새 디렉터리(n 변수 사용)로 추출합니다.

내 경우에는 이것을 다른 디렉터리에서 실행되는 스크립트에 넣었습니다.

관련 정보