아직 존재하지 않는 파일의 파일 이름 패턴

아직 존재하지 않는 파일의 파일 이름 패턴

내 것과 같은 셸 모드를 사용하면 {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}"

관련 정보