이 명령을 사용하면 디렉터리와 하위 디렉터리의 아카이브를 재귀적으로 압축 해제하여 현재 작업 디렉터리의 구조를 보존할 수 있습니다.
find ../backUp/ -name "*.zip" |
xargs -P 5 -I fileName sh -c '
unzip -o -d "$(dirname "fileName")/$(basename -s .zip "fileName")" "fileName"
'
하지만 실행하면 압축이 풀린 모든 폴더가 원래 디렉터리에 남아 있습니다. Bash 환경에서 basename과 dirname을 하드코딩할 수 있나요?
예시 추가:
/backUp/pic1/1.zip
/backUp/pic2/2.zip
/backUp/pic3/3.zip
Goal:
/new/pic1/1-1.png
/new/pic1/1-2.png
/new/pic2/2-1.png
/new/pic2/2-2.png
/new/pic3/3-1.png
답변1
찾기 옵션을 사용해야 합니다 -execdir
. 그러면 cd
일치하는 파일("*.zip")이 포함된 각 디렉터리에 도달하여 지정한 명령을 실행하고 해당 특정 디렉터리의 일치하는 파일 이름을 명령에 대한 인수로 전달합니다.
예를 들어:
find . -name '*.zip' -execdir sh -c 'for f; do unzip -o "$f"; done' find-sh {} +
참고: as 명령을 사용하고 있으므로 sh -c
더미 인수를 첫 번째(0번째) 인수로 전달해야 합니다. 이는 커널 프로세스 테이블의 프로세스 이름이 됩니다(여기서는 find-sh
이름으로 사용함 ). 나머지 매개변수는 {}
파일 이름입니다. 이러한 항목은 , , , 등과 sh -c
같은 일반적인 방법으로 스크립트에서 액세스 할 수 있습니다 . 이 예에서는 해당 항목을 반복합니다.$1
$2
$3
$@
$*
for f; do ... ; done
for f in "$@"; do ... ; done
그런데 작동 방식을 보려면 echo
압축을 푸는 대신 사용할 수 있습니다. 예를 들어, 다음 명령은 하나 이상의 .zip 파일이 포함된 각 디렉터리의 이름과 그 뒤에 콜론 및 해당 디렉터리의 .zip 파일 목록을 인쇄합니다. 디렉터리당 한 줄씩 출력합니다.
find . -name "*.zip" -execdir sh -c 'echo "$PWD:" "$@"' find-sh {} +