이것은 다음의 출력입니다 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