![디렉토리의 모든 파일을 cli 매개변수로 추가](https://linux55.com/image/186846/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20cli%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C%20%EC%B6%94%EA%B0%80.png)
아래와 같은 명령을 실행해야 합니다.
mycli --file test.zip --file another_test.zip
디렉토리의 모든 zip 파일을 동적으로 실행하려면 어떻게 해야 합니까? find 명령을 통해 파일을 전송할 수 있다고 확신하지만 해당 파일을 다른 명령에 인수로 추가하는 방법을 모르고 bash-fu가 좋지 않습니다.
답변1
배열을 사용하십시오:
unset -v args
declare -a args
for file in *.zip
do
args+=( --file "$file" )
done
mycli "${args[@]}"
또는 POSIX적으로:
set --
for file in *.zip
do
set -- "$@" --file "$file"
done
mycli "$@"
또는 GNU 도구를 가정하면 다음과 같습니다.
find . -maxdepth 1 -name '*.zip' -printf '--file\0%f\0' |
xargs -0 -- mycli
배열 기반 방법과 배열 기반 방법 xargs
의 관련 차이점 : 전자는 다음과 같이 실패할 수 있습니다."매개변수 목록이 너무 깁니다"오류(내장 명령이 아니라고 가정 ), 후자는 여러 번 mycli
실행되지 않으며 실행됩니다 . mycli
그러나 마지막 경우에는 마지막 호출 중 하나를 제외한 모든 매개변수 목록이 --file
다음으로 끝날 수 있습니다(다음 매개변수 목록은 파일 이름으로 시작함). 사용 사례에 따라 xargs
' 옵션(예: -n
및 -x
)을 조합하여 이러한 일이 발생하지 않도록 할 수 있습니다 .
또한 find
포함됩니다.숨겨진 파일반면 배열 기반 대안은 dotglob
쉘 옵션이 Bash에 설정되어 있지 않거나 *.zip
POSIX 쉘에서 글로빙 표현식과 둘 다 사용되지 않는 한 그렇지 않습니다. .*.zip
자세한 내용 및 참고 사항:
한 디렉터리에서 다른 디렉터리로 모든 파일(숨겨진 파일 포함)을 이동하는 방법은 무엇입니까?.
답변2
수천 개의 파일이 없다고 가정하면("매개변수 목록이 너무 깁니다" 오류 발생) 셸을 사용하여 다음을 수행할 수 있습니다 zsh
.
mycli ./*.zip(P:--file:)
또는 bash
셸에서 다음을 수행합니다.
zsh -c 'exec mycli ./*.zip(P:--file:)'
( 여기서는 효율성을 위해 쉘 exec
대신 프로세스를 사용하고 있습니다 .)zsh
mycli
파일 이름 globbing 한정자는 glob이 확장되는 각 요소 앞에 P
지정된 문자열(here )을 별도의 단어로 추가합니다 .--file
숨겨진 파일을 포함하려면 D
before 를 추가하고 P
, 일반 파일만 일치하도록 제한하려면 다음을 추가하세요 .
.
zsh -c 'exec mycli ./*.zip(.DP:--file:)'
하위 디렉터리로의 재귀의 경우:
zsh -c 'exec mycli ./**/*.zip(.DP:--file:)'
...수정 타임스탬프(선호), om
파일을 추가한 방식 D
, .
이전에 추가한 방식 순으로 파일을 정렬합니다.
답변3
이것은 작동합니다:
ls *.zip | xargs printf "--file %s " | xargs echo mycli
결과 명령에 만족하면 echo
두 번째 명령을 삭제 xargs
하고 다시 실행하십시오.
zip 파일 이름에 공백이나 기타 쉘 메타 문자가 포함되어 있으면 상황이 더 복잡해집니다.