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 변수 사용).

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

관련 정보