공백이 있는 디렉터리 이름을 읽기 위해 for 루프를 어떻게 만들 수 있나요?

공백이 있는 디렉터리 이름을 읽기 위해 for 루프를 어떻게 만들 수 있나요?

디렉터리에서 폴더를 검색하고 각 폴더의 이름을 가져오고, .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
  1. 현재 디렉토리의 모든 파일을 반복합니다.
  2. 디렉토리를 필터링합니다(디렉토리에 대한 심볼릭 링크 포함).
  3. 그런 다음 지정된 디렉터리에 요청된 파일을 만듭니다.

당신은 또한에 관심이있을 수 있습니다주택 검사일반적인 실수/나쁜 관행(예: 이 예에서는 ls 사용)을 지적합니다.

답변2

이를 통해 zsh다음을 수행할 수 있습니다.

touch -- *(/e['REPLY+=/$REPLY.txt'])

여기서 /glob 한정자는 glob 확장을 파일 유형으로 제한합니다.목차-/(디렉토리에 대한 심볼릭 링크도 고려하려는 경우 로 변경) e한정자는 e주어진 코드를 평가하여 경로(에 저장됨 $REPLY)를 수정합니다. D( Dot 파일의 경우) 한정자를 추가하면 숨겨진 디렉터리에 대해서도 이 작업이 수행됩니다( 어떤 경우에도 포함하지 않음) ....

관련 정보