![공백이 있는 디렉터리 이름을 읽기 위해 for 루프를 어떻게 만들 수 있나요?](https://linux55.com/image/208951/%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%9D%BD%EA%B8%B0%20%EC%9C%84%ED%95%B4%20for%20%EB%A3%A8%ED%94%84%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EB%A7%8C%EB%93%A4%20%EC%88%98%20%EC%9E%88%EB%82%98%EC%9A%94%3F.png)
디렉터리에서 폴더를 검색하고 각 폴더의 이름을 가져오고, .txt 파일을 만들고, 폴더 이름으로 이름을 지정하고 해당 폴더에 넣는 스크립트를 만들어야 합니다.
예: 디렉터리에 "1", "2" 및 "3"이라는 이름의 3개 폴더가 있습니다. 해당 폴더 이름으로 이름이 지정된 각 폴더에 .txt 파일을 생성하여 폴더 1에 "1.txt"가 " 2.txt" 등을 폴더 2에 저장합니다.
나는 이 스크립트를 사용하여 이를 수행했습니다.
for i in $(ls -d */); do touch "$i $(basename $i).txt" ; done
문제는 이름에 공백이 있는 폴더에 대해 동일한 작업을 수행하고 싶다는 것입니다. 예를 들어, "Test Me"라는 폴더가 있으면 다음과 같은 오류가 발생합니다.
Me: no directory with that name
"Me"라는 단어만 보고 "Test Me" 전체가 아닌 폴더로 처리합니다.
어떻게 해야 하나요?
고쳐 쓰다
이것이 TAAPSogeking이 아래에 언급한 해결책입니다(그에게 다시 한 번 감사드립니다).
for dir in *; do [ -d "$dir" ] && touch "$dir/$dir.txt"; done
답변1
중첩된 하위 디렉터리가 모두 필요하지 않고 직접 디렉터리만 필요하다고 가정합니다. 다음은 현재 루프하려는 디렉터리와 동일한 디렉터리에 있다고 가정합니다.
for dir in *; do
[ -d "$dir" ] && touch -- "$dir/$dir.txt"
done
- 현재 디렉토리의 모든 파일을 반복합니다.
- 디렉토리를 필터링합니다(디렉토리에 대한 심볼릭 링크 포함).
- 그런 다음 지정된 디렉터리에 요청된 파일을 만듭니다.
당신은 또한에 관심이있을 수 있습니다주택 검사일반적인 실수/나쁜 관행(예: 이 예에서는 ls 사용)을 지적합니다.
답변2
이를 통해 zsh
다음을 수행할 수 있습니다.
touch -- *(/e['REPLY+=/$REPLY.txt'])
여기서 /
glob 한정자는 glob 확장을 파일 유형으로 제한합니다.목차-/
(디렉토리에 대한 심볼릭 링크도 고려하려는 경우 로 변경) e
한정자는 e
주어진 코드를 평가하여 경로(에 저장됨 $REPLY
)를 수정합니다. D
( D
ot 파일의 경우) 한정자를 추가하면 숨겨진 디렉터리에 대해서도 이 작업이 수행됩니다( 어떤 경우에도 포함하지 않음) .
...