폴더의 압축을 풀고 디렉터리를 압축이 풀린 폴더로 변경하는 방법

폴더의 압축을 풀고 디렉터리를 압축이 풀린 폴더로 변경하는 방법

파일의 압축을 풀고 압축을 푼 파일로 CD를 넣을 수 있는 스크립트를 만들려고 합니다(즉, test.zip의 압축을 풀고 테스트 폴더로 CD를 옮깁니다). 문제는 zip 파일의 이름이 서로 다르며 이름에 관계없이 작동하는 스크립트를 작성하려고 한다는 것입니다.

현재 나는 다음을 가지고 있습니다:

for file in $(ls *.zip);
do
        unzip ${file}
        cd ${file};
done

하지만 ${file}이 여전히 .zip 파일이기 때문에 오류가 발생합니다(오류를 올바르게 이해한 경우).

어떤 제안이 있으십니까?

감사해요.

편집: 명확히 하기 위해 .zip 파일 내의 파일에 대한 분석을 수행하려고 합니다. 그래서 내 목표는 먼저 파일의 압축을 풀고(zip 파일과 이름은 같지만 .zip이 없는 디렉터리를 생성함) 그 디렉터리로 CD를 넣는 것입니다. 해당 디렉토리에 들어가면 파일 분석을 시작하는 또 다른 코드 줄이 있습니다.

답변1

i) zip 파일이 새 디렉토리를 생성하고 ii) 디렉토리가 zip 파일과 동일한 이름(확장자 제외)을 갖는다고 가정하면 .zip(두 가정 모두 일반적으로 잘못됨) 다음을 수행할 수 있습니다.

for file in *.zip
do
    unzip -- "$file"
    cd -- "${file%%zip}"
done

또는 보다 일반적으로 ${file%%zip}구문은 삭제된 ${variable%%pattern}값을 반환합니다. 파일 이름이 인 경우 반환됩니다.$variablepattern${file%%zip}foofoo.zip

이는 --옵션의 끝을 나타내며, 파일 이름이 로 끝나면 -전혀 사용할 필요가 없다는 점에 유의하세요. ls이는 구문 분석 이후 매우 좋습니다.ls 매우 깨지기 쉬우므로 절대 권장하지 않습니다..

먼저 디렉터리가 존재하는지 확인하면 이 프로세스를 더 복잡하게 만들 수 있습니다.

for file in *.zip
do
    unzip -- "$file"
    [ -d "${file%%zip}" ] && cd -- "${file%%zip}"
done

이는 디렉터리에서 실행되는 스크립트에서 작업을 수행하려는 경우에만 유용합니다. 그렇지 않고 이 명령을 실행하려고 하고 현재 셸 세션이 현재 대상 디렉터리에 있는 경우 cd스크립트를 시작한 셸이 아닌 스크립트를 실행하는 셸에 영향을 주지 않으므로 이 작업은 발생하지 않습니다 .

따라서 이것이 파일을 추출하고 새 디렉터리로 이동한 다음 대화형 셸 세션에서 작업을 수행하는 방법이 되도록 하려면 이를 스크립트가 아닌 함수로 만들어야 합니다.

unzipcd(){
    for file in *.zip
    do
        unzip -- "$file"
        [ -d "${file%%zip}" ] && cd -- "${file%%zip}"
    done
}

관련 정보