디렉토리의 모든 파일을 cli 매개변수로 추가

디렉토리의 모든 파일을 cli 매개변수로 추가

아래와 같은 명령을 실행해야 합니다.

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에 설정되어 있지 않거나 *.zipPOSIX 쉘에서 글로빙 표현식과 둘 다 사용되지 않는 한 그렇지 않습니다. .*.zip자세한 내용 및 참고 사항: 한 디렉터리에서 다른 디렉터리로 모든 파일(숨겨진 파일 포함)을 이동하는 방법은 무엇입니까?.

답변2

수천 개의 파일이 없다고 가정하면("매개변수 목록이 너무 깁니다" 오류 발생) 셸을 사용하여 다음을 수행할 수 있습니다 zsh.

mycli ./*.zip(P:--file:)

또는 bash셸에서 다음을 수행합니다.

zsh -c 'exec mycli ./*.zip(P:--file:)'

( 여기서는 효율성을 위해 쉘 exec대신 프로세스를 사용하고 있습니다 .)zshmycli

파일 이름 globbing 한정자는 glob이 확장되는 각 요소 앞에 P지정된 문자열(here )을 별도의 단어로 추가합니다 .--file

숨겨진 파일을 포함하려면 Dbefore 를 추가하고 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 파일 이름에 공백이나 기타 쉘 메타 문자가 포함되어 있으면 상황이 더 복잡해집니다.

관련 정보