경로에서 *와 터치를 사용할 수 없는 이유는 무엇입니까? [복사]

경로에서 *와 터치를 사용할 수 없는 이유는 무엇입니까? [복사]

이것은 다음의 출력입니다 tree.

[xyz@localhost Semester1]$ tree
.
├── Eng
├── IT
├── IT_workshop
├── LA
├── OS
├── OS_lab
├── Psy
├── Python
└── Python_lab

9 directories, 0 files

모든 디렉토리에서 사용하고 싶습니다 touch.

나는 다음 명령을 시도했습니다.

[xyz@localhost Semester1]$ touch */{credits,links,notes}

출력은 다음과 같습니다.

touch: cannot touch ‘*/credits’: No such file or directory
touch: cannot touch ‘*/links’: No such file or directory
touch: cannot touch ‘*/notes’: No such file or directory

이 명령이 예상대로 작동하지 않는 이유는 무엇입니까?

그런데 저는 CentOS Linux 7을 사용하고 있습니다.

답변1

문제는 */쉘이 명령을 시작하기 전에 glob(glob)을 확장한다는 것입니다. 그리고 중괄호 확장은 전역 확장보다 먼저 발생합니다. 이는 이러한 glob이 셸에 의해 확장되고 파일이 아직 생성되지 않았기 때문에 glob이 자체적으로 확장된다는 것을 의미 */{credits,links,notes}합니다 '*/credits' '*/links' '*/notes'.

아무것도 일치하지 않는 모든 glob에 대해 동일한 동작을 볼 수 있습니다. 예를 들어:

$ echo a*j
a*j

일치하는 경우:

$ touch abj
$ echo a*j
abj

귀하의 사례로 돌아가서 파일이 실제로 존재하지 않으므로 실행하는 명령은 다음과 같습니다.

touch '*/credits' '*/links' '*/notes'

다음 중 하나를 만들면 상황이 바뀌는 것을 볼 수 있습니다.

$ touch Psy/credits
$ touch */{credits,links,notes}
touch: cannot touch '*/links': No such file or directory
touch: cannot touch '*/notes': No such file or directory

*/credits이제 glob , file 과 일치하는 하나의 파일이 있으므로 Psy/credits이 파일은 작동하지만 나머지 두 파일은 오류가 발생합니다.

당신이 시도하는 것을 수행하는 올바른 방법은 다음과 같습니다

for d in */; do touch "$d"/{credits,links,notes}; done

결과 :

$ tree
.
├── abj
├── Eng
│   ├── credits
│   ├── links
│   └── notes
├── IT
│   ├── credits
│   ├── links
│   └── notes
├── IT_workshop
│   ├── credits
│   ├── links
│   └── notes
├── LA
│   ├── credits
│   ├── links
│   └── notes
├── OS
│   ├── credits
│   ├── links
│   └── notes
├── OS_lab
│   ├── credits
│   ├── links
│   └── notes
├── Psy
│   ├── credits
│   ├── links
│   └── notes
├── Python
│   ├── credits
│   ├── links
│   └── notes
└── Python_lab
    ├── credits
    ├── links
    └── notes

관련 정보