이 명령에서 dirname과 basename은 무엇이어야 합니까?

이 명령에서 dirname과 basename은 무엇이어야 합니까?

이 명령을 사용하면 디렉터리와 하위 디렉터리의 아카이브를 재귀적으로 압축 해제하여 현재 작업 디렉터리의 구조를 보존할 수 있습니다.

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 ... ; donefor f in "$@"; do ... ; done

그런데 작동 방식을 보려면 echo압축을 푸는 대신 사용할 수 있습니다. 예를 들어, 다음 명령은 하나 이상의 .zip 파일이 포함된 각 디렉터리의 이름과 그 뒤에 콜론 및 해당 디렉터리의 .zip 파일 목록을 인쇄합니다. 디렉터리당 한 줄씩 출력합니다.

find . -name "*.zip" -execdir sh -c 'echo "$PWD:" "$@"' find-sh {} +

관련 정보