와일드카드를 사용하여 item={one,two,third} 확장

와일드카드를 사용하여 item={one,two,third} 확장

중괄호 확장을 사용하면 bash목록이 표시됩니다.

echo item={one,two,three}
item=one item=two item=three

와일드카드와 일치하는 파일/폴더가 포함된 디렉터리에 있다고 가정하면 해당 파일/폴더와 일치하는 확장을 수행할 수 있는 방법이 있습니까?

ls
blue  green  red

echo item=*      # Obviously not
item=*

echo item={*}    # Maybe? ...but no
item={*}

내 경우에는 다음으로 확장하고 싶습니다.item=blue item=green item=red

내가 얻은 최고는 다음과 같은 코드였습니다.

items=()
for dirent in *; do items+=("item=$dirent"); done
echo "${items[@]}"

item=blue item=green item=red

답변1

다음과 같이 현재 디렉터리의 파일을 배열에 저장할 수 있습니다.

items=(*)

그런 다음 매개변수 확장을 사용하여 접두사를 추가할 수 있습니다.

printf "%s\n" "${items[@]/#/item=}"

이를 사용하여 배열을 업데이트할 수 있습니다.

items=("${items[@]/#/item=}")

답변2

그리고 zsh:

items=(*)
print -rC1 item=$^items

또는:

(){ print -rC1 item=$^@; } *

또는:

(){ print -rC1 ${@/#/item=}; } *

또는:

print -rC1 ./*(:s:./:item=)

또는:

set -o histsubstpattern
print -rC1 *(:s/#/item=)

또는:

print -rC1 *(e['REPLY=item=$REPLY'])

또는:

printf '%s%s\n' *(P[item=])

또는:

items=()
printf -v items 'item=%s' *
print -rC1 -- $items

등.

이들 모두에 대해 일치하는 파일이 없을 때(여기서는 현재 디렉터리를 읽을 수 없거나 숨겨진 파일만 포함함을 의미) 오류 대신 N출력을 가져오지 않도록(또는 해당 출력이 있는 빈 줄) glob 한정자를 추가합니다.printf*

물론, 그냥 인쇄한다면 다음과 같이 할 수 있습니다(모든 쉘에서):

printf 'item=%s\n' *

관련 정보