디렉토리의 각 파일에 대한 디렉토리를 생성하려고 합니다.
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})
또는 :s
glob에 적용된 기록 수정자 ( histsubstpattern
for%
끝):
set -o histsubstpattern
mkdir -- *(:s/%/.d)
^-/
glob 한정자를 추가하여 이미 디렉터리 또는 디렉터리 심볼릭 링크인 파일에 대해 이 작업을 수행 하고 싶지 않을 수도 있습니다 .
files=(*(^-/))
mkdir -- $^files.d
( zsh
일치하지 않는 패턴이 그대로 전달되는 다른 Bourne 유사 쉘의 결함이 없으므로 현재 디렉토리에 일치하는 파일이 없으면 mkdir *.d
디렉토리가 생성되지 않고 대신 명령을 중단합니다. 오류)*.d
*.d