zip 파일 이름에서 가져온 디렉터리 이름을 사용하여 .zip 파일 목록을 각각의 새 디렉터리에 추출합니다.

zip 파일 이름에서 가져온 디렉터리 이름을 사용하여 .zip 파일 목록을 각각의 새 디렉터리에 추출합니다.

파일이 많은 폴더가 있습니다 .zip. 그들의 이름은 다음과 같습니다.

John-Rupert A. Doe_nnnnnnn_assignsubmission_file_*.zip

여기서 n는 숫자, *는 문자열, John-Rupert A. Doe는 공백, 점, 대시를 포함할 수 있는 문자열입니다.

각각에 대해 다음을 수행하고 싶습니다.

  1. 디렉터리를 만듭니다. 나는 다음을 통해 이 작업을 수행합니다.

    ls | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-' | xargs -L 1 mkdir
    

    (그래서 위의 예에 해당하는 디렉토리 이름은 JohnRupertADoe)

  2. 이제 이 파일 이름으로 .zip생성된 디렉터리 에 각 파일을 추출하고 싶습니다. .zip하지만 어떻게?

답변1

당신은 시도 할 수 있습니다:

for z in ./*.zip
do name="${z%%_*}"; dest=".${name//[ .-]/}"; mkdir "$dest"; unzip "$z" -d "$dest"
done

zip 파일에 대해 이름 부분을 추출한 다음( ${z%%_*}접미사를 탐욕스럽게 제거) 점, 대시 및 공백( ${name//[ .-]/})을 모두 제거하고 결과 문자열을 인수로 전달하여 mkdir해당 디렉터리를 생성합니다. 그런 다음 지정된 대상에 아카이브를 추출합니다 d.

답변2

테스트되지 않음:

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g' | tr -d '.' | tr -d '-'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done

또는 두 파이프를 모두 제거하려면 tr파이프를 추가할 수 있습니다 sed(테스트되지 않음).

for i in *.zip; do
  zipdir() { echo "$i" | cut -d'_' -f 1 | sed 's/ //g;s/.//g;s/-//g'; }
  zipdir | xargs -L 1 mkdir
  mv "$i" "$(zipdir)"/
done

관련 정보