먼저 사소한하지만, 적용 할 답변 잘라 : 나는 둘 다 사용할 수 있습니다 find
+의 xargs
트릭도 (같은 그 변종 find
과를 -exec
내가 호출 당 몇 등의 표현을 사용해야하기 때문에). 나는 결국 이것으로 돌아올 것이다.
더 나은 예를 들어 보자.
$ find -L some/dir -name \*.abc | sort
some/dir/1.abc
some/dir/2.abc
some/dir/a space.abc
이것들을 인수로 program
어떻게 전달 합니까?
그냥 그렇게하는 것은 속임수를하지 않습니다
$ ./program $(find -L some/dir -name \*.abc | sort)
program
다음과 같은 인수를 얻으므로 실패합니다 .
[0]: ./program
[1]: some/dir/1.abc
[2]: some/dir/2.abc
[3]: some/dir/a
[4]: space.abc
알 수 있듯이 공간이있는 경로는 분리되어 program
두 가지 다른 인수로 간주됩니다.
작동 할 때까지 견적
그러한 문제에 직면했을 때 나 같은 초보자 사용자는 마침내 작동 할 때까지 무작위로 따옴표를 추가하는 경향이 있습니다. 단지 도움이되지 않는 것 같습니다 ...
"$(…)"
$ ./program "$(find -L some/dir -name \*.abc | sort)"
[0]: ./program
[1]: some/dir/1.abc
some/dir/2.abc
some/dir/a space.abc
따옴표는 단어 분리를 방지하기 때문에 모든 파일이 단일 인수로 전달됩니다.
개별 경로 인용
유망한 접근법 :
$ ./program $(find -L some/dir -name \*.abc -printf '"%p"\n' | sort)
[1]: "some/dir/1.abc"
[2]: "some/dir/2.abc"
[3]: "some/dir/a
[4]: space.abc"
따옴표가 있습니다. 그러나 그들은 더 이상 해석되지 않습니다. 그들은 단지 문자열의 일부입니다. 그래서 그들은 단어 분리를 막을뿐만 아니라 논쟁에 빠졌습니다!
IFS 변경
그런 다음와 놀아 보았습니다 IFS
. 내가 선호 find
와 -print0
와 sort
와 -z
어쨌든 - 그들은 "유선 경로"자신에 아무런 문제가 없습니다 그래서. 그렇다면 왜 단어를 강제로 null
캐릭터에 분배 하고 모든 것을 가지고 있지 않습니까?
$ ./program $(IFS=$'\0' find -L some/dir -name \*.abc -print0 | sort -z)
[0]: ./program
[1]: some/dir/1.abcsome/dir/2.abcsome/dir/a
[2]: space.abc
따라서 여전히 공간에서 분할되고에서 분할되지 않습니다 null
.
위와 같이 및 이전에 IFS
과제 를 배치하려고했습니다 . 또한 내가 좋아하는 다른 구문을 시도 , , 모두 인용 와 와와없이뿐만 아니라 . 그 중 어느 것도 차이를 보이지 않는 것 같습니다…$(…)
./program
\0
\x0
\x00
'
"
$
그리고 나는 아이디어가 없다. 몇 가지 더 시도했지만 모두 나열된 것과 동일한 문제가 발생하는 것 같습니다.
다른 무엇을 할 수 있습니까? 전혀 가능합니까?
물론 program
패턴을 받아들이고 검색 할 수 있습니다. 그러나 특정 구문으로 수정하는 동안 많은 이중 작업이 필요합니다. ( grep
예를 들어 파일을 제공하는 것은 어떻습니까?)
또한 program
경로 목록이있는 파일을 수락 할 수 있습니다. 그런 다음 find
임시 파일에 식을 쉽게 덤프 하고 해당 파일의 경로 만 제공 할 수 있습니다 . 이것은 직접 경로를 따라 지원되므로 사용자가 간단한 경로를 가진 경우 중간 파일없이 제공 할 수 있습니다. 그러나 이것은 좋지 않은 것처럼 보입니다-필요한 추가 구현은 말할 것도없고 추가 파일을 생성하고 관리해야합니다. (그러나 장점은 인수로 파일의 수가 명령 줄 길이에 문제를 일으키는 경우를 대비 한 구조 일 수 있습니다 ...)
결국, find
+ xargs
(그리고 같은) 트릭이 내 경우에는 작동하지 않는다는 것을 다시 상기시켜 드리겠습니다 . 설명의 편의를 위해 하나의 인수 만 표시합니다. 그러나 내 진정한 경우는 다음과 같습니다.
$ ABC_FILES=$(find -L some/dir -name \*.abc | sort)
$ XYZ_FILES=$(find -L other/dir -name \*.xyz | sort)
$ ./program --abc-files $ABC_FILES --xyz-files $XYZ_FILES
따라서 xargs
한 번의 검색을 수행하면 다른 검색을 처리하는 방법이 여전히 남아 있습니다.
mapfile
(또는 그 동의어readarray
) 에서 아무것도 찾지 못했습니다 . 그러나 작동합니다!