중괄호 확장을 사용하면 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' *