![아직 존재하지 않는 파일의 파일 이름 패턴](https://linux55.com/image/118799/%EC%95%84%EC%A7%81%20%EC%A1%B4%EC%9E%AC%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%ED%8C%A8%ED%84%B4.png)
내 것과 같은 셸 모드를 사용하면 {abc,def}xyz
이를 사용하여 아직 존재하지 않는 파일(또는 디렉터리)을 만들 수 있습니다.
$ ls
$ touch {abc,def}xyz
$ mkdir 123{a,b,c}
$ ls
123a 123b 123c abcxyz defxyz
나를 혼란스럽게 하는 것은 패턴과 일치하는 각 폴더 집합 내에 하위 디렉터리를 만드는 방법입니다. 예를 들어, 이제 123a
, 123b
, 가 있으므로 123c
명시적으로 나열하지 않고도 각 디렉터리 내에 하위 디렉터리를 만들 수 있습니까?
$ mkdir {12*}/rsnapshot # Fails because 12* isn't a list
$ mkdir 12*/rnapshot # Fails because 12*/rsnapshot doesn't exist
$ mkdir 123{a,b,c}/rsnapshot # Succeeds but more complex than I'd like
마지막 예는 작동하지만 하위 절에 각 디렉토리 이름의 특정 부분을 나열해야 합니다 {...}
. 디렉토리 수가 많으면 불가능합니다.
공백이 없는 단순한 이름에도 이 줄을 적용했지만 일반적인 솔루션에서는 명확하지도 우아하지도 않습니다.
echo -n 12* '' | xargs -r -d ' ' -I {} echo mkdir {}/rsnapshot
bash
반복 없이 비슷한 이름의 하위 디렉터리 집합에 파일이나 하위 디렉터리를 생성할 수 있는 패턴 템플릿이 있습니까 ?
답변1
이전 명령 매개변수를 다시 호출하면 됩니다.!$
mkdir 123{a,b,c}
mkdir !$/rsnapshot
패턴에 지정된 디렉토리 이름 내에 하위 디렉토리를 생성하기 위해 find를 사용하지 않을 경우주기.
find . -maxdepth 1 -type d -name "123*" -exec mkdir '{}/rsnapshot' \;
답변2
dirs=( 123* )
set -- "${dirs[@]/%//deep/and deeper}"
mkdir -p "$@"
이건 설명이 필요 없을 것 같네요...
답변3
"123{a,b,c}/rsnapshot보다 간단한" 솔루션은 있을 수 없다고 생각합니다. 하지만 사물의 복잡성에 대한 우리의 인식은 크게 다를 수 있습니다.
하지만 나는 "껍질과 같은" 것을 제공할 수 있습니다. 안타깝게도 경로 이름 확장으로 생성된 요소를 구분하는 문자를 구성하는 것은 불가능해 보이 bash
므로 더욱 복잡해집니다.
:> dirs=(12*/.) # the dot makes it match directories only
:> echo ${dirs[*]}
123a/. 123b/. 123c/.
:> IFS=,
:> eval echo mkdir -p "{${dirs[*]}}/rsnapshot"
mkdir -p 123a/./rsnapshot 123b/./rsnapshot 123c/./rsnapshot
물론 이는 경로 이름 확장 일치 항목에 쉼표가 포함되지 않은 경우에만 작동합니다. 이는 으로 예방할 수 있습니다 $GLOBIGNORE
.
printf
그리고xargs
수정하겠습니다.
printf "%s/rsnapshot\0" 12*/. | xargs -0 echo mkdir -p
답변4
(다른 허용된 답변에서) 모든 123
디렉토리가 유효한 것 같습니다.
dirs=(123*/)
mkdir "${dirs[@]/%/rsnapshot}"