글쎄요, 제 생각에는 이 플랫폼에서 파이프 연결 방법에 대한 수십 가지 질문을 찾을 수 있을 것 같습니다.find
산출하지만 sed
지금까지 반대 방향에서는 아무것도 찾지 못했습니다. 내가 하고 싶은 것은 내 것을 수정하는 것이다.입력하다, 그리고그 다음에에 전달하세요 find
.
지루한 별표 와일드카드를 입력하는 것을 피함으로써 내 삶을 더 쉽게 만들기 위해 다음과 같은 작업을 수행하고 싶다고 가정해 보겠습니다. (이 문자열 연산자 뒤에 오는 표현식이 결국 스크립트의 뒷부분에서 <<<
매개 변수로 대체될 계획이라는 것이 분명하기를 바랍니다. 아래 줄은 데모용으로만 제공됩니다.)$1
$ sed 's/ /\*/g' <<< ' foo bar baz ' | find . -type f -iname -
-
사실 이 줄의 끝은~해야 한다출력을 sed
입력으로 사용하십시오 find
. 그러나 find
해당 섹션을 다음으로 확장하십시오.
... find -D tree . -type f -iname - ...
이 매개변수를 표시합니다.아니요파이프를 사용하여 전처리된 입력을 전달할 수 없는 것일 수도 find
있습니다 .find
답변1
find
인수는 표준 입력이 아닌 명령줄에서 가져옵니다. 따라서 다음과 같습니다.
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
그것은 다음과 같습니다:
find . -iname "foo*bar*baz*"
(쉘이 와일드카드 foo*bar*baz*를 확장하는 것을 방지하려면 따옴표가 필요합니다)
이것은 당신이 원하는 것일 수도 있고 아닐 수도 있습니다. 예를 들어 foo, bar 또는 baz로 시작하는 파일을 원하지만 "foo*bar*baz*" 패턴과 일치하는 파일은 원하지 않는 경우 정규식을 구성하고 대신 or -regex
를 사용해야 합니다 . 또는 다음과 같이 더 복잡한 찾기 명령을 작성하십시오.-iregex
-iname
-iname 'foo*' -o -iname 'bar*' -o -iname 'baz*'
또는:
PATTERN='foo bar baz'
PATTERN=$(echo "$PATTERN" | sed -e 's/ /*/g')
# and/or do whatever else you need to do to transform $PATTERN to be what
# you need it to be...
find . -iname "$PATTERN"
이것은 bash 스크립트의 코드 줄입니다. 명령줄에서와 마찬가지로 스크립트에서도 정확히 동일한 방식으로 작동합니다.
$ cat ./test.sh
#! /bin/bash
find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
$ ls -l
total 4
-rw-r--r-- 1 cas cas 0 Sep 26 16:53 doesntmatch
lrwxrwxrwx 1 cas cas 16 Sep 26 16:59 symlink -> xfoo-ybar-zbaz01
-rwxr-xr-x 1 cas cas 69 Sep 26 16:50 test.sh
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz01
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz02
-rw-r--r-- 1 cas cas 0 Sep 26 16:50 xfoo-ybar-zbaz03
$ ./test.sh
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
$ find . -iname "$(sed 's/ /\*/g' <<< ' foo bar baz ')"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
$ find . -iname "*foo*bar*baz*"
./xfoo-ybar-zbaz01
./xfoo-ybar-zbaz03
./xfoo-ybar-zbaz02
답변2
for 루프를 사용하지 않는 이유는 무엇입니까?
for n in $(sed 's/ /\*/g' <<< ' foo bar baz '); do find . -iname $n; done