Bash 와일드카드가 확장되지 않습니다.

Bash 와일드카드가 확장되지 않습니다.

디렉토리의 각 파일에 대한 디렉토리를 생성하려고 합니다.

mkdir *

파일이 존재함을 반환합니다. 그래서 난 노력해

mkdir *.d

"*.d"라는 디렉터리를 생성합니다. 와일드카드 확장을 강제하는 방법은 무엇입니까?

답변1

와일드카드는 항상 다음으로 확장됩니다.기존의이름.

mkdir *확장 이름이 이미 존재하므로 명령이 실패했습니다 *.

기존 이름과 일치하지 않기 때문에 명령이 mkdir *.d"실패"합니다 . *.d따라서 기본적으로 모드는 1을*.d 확장하지 않고 라는 디렉터리를 생성합니다. 를 사용하여 삭제할 수 있습니다 rmdir '*.d'.

각 디렉토리에 대한 디렉토리 생성일반 파일새 디렉토리가 파일과 동일한 이름을 갖지만 접미사가 붙도록 현재 디렉토리에 .d:

for name in ./*; do
    if [ -f "$name" ]; then
        # this is a regular file (or a symlink to one), create directory
        mkdir "$name.d"
    fi
done

또는 "quips"를 좋아하는 분들을 위해

for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done

다음 에서도 bash이 작업을 수행할 수 있습니다 .

names=( ./* )
mkdir "${names[@]/%/.d}"

그러나 이것은 glob이 확장하는 콘텐츠가 일반 파일인지 아니면 다른 파일인지 확인하지 않습니다.

위 명령의 첫 번째 문자는 파일 이름에 첫 번째 문자 대시( )가 포함되지 ./않도록 하기 위한 것입니다 . -그렇지 않으면 대시와 그 뒤의 문자가 options 로 해석됩니다 mkdir.


1일부 쉘에는 일치하지 않는 쉘 와일드카드가 빈 문자열로 확장되도록 하는 쉘 옵션이 있습니다 . nullglob여기에서 bash사용을 활성화하세요 shopt -s nullglob.

답변2

for foo in bar; do baz; done내가 제안하는 것은 해결책이 아닙니다.

find . -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d

답변3

*.d이름을 로 확장합니다 .d.

이를 통해 zsh다음을 수행할 수 있습니다.

files=(*)
mkdir -- $^files.d

또는 익명 함수를 사용하십시오.

() { mkdir -- $^argv.d; } *

또는 glob 한정자를 통해 접미사를 추가하세요 e.

mkdir -- *(e{REPLY+=.d})

또는 :sglob에 적용된 기록 수정자 ( histsubstpatternfor%):

set -o histsubstpattern
mkdir -- *(:s/%/.d)

^-/glob 한정자를 추가하여 이미 디렉터리 또는 디렉터리 심볼릭 링크인 파일에 대해 이 작업을 수행 하고 싶지 않을 수도 있습니다 .

files=(*(^-/))
mkdir -- $^files.d

( zsh일치하지 않는 패턴이 그대로 전달되는 다른 Bourne 유사 쉘의 결함이 없으므로 현재 디렉토리에 일치하는 파일이 없으면 mkdir *.d디렉토리가 생성되지 않고 대신 명령을 중단합니다. 오류)*.d*.d

관련 정보