ls 출력에 대한 루프가 작동하지 않는 이유는 무엇입니까?

ls 출력에 대한 루프가 작동하지 않는 이유는 무엇입니까?

for 루프에 디렉토리 이름을 입력하려고 합니다. 내 코드는 다음과 같습니다.

td='/Test/TopDir/'
cd "$td" 
for x in $(ls -d */ | cut -f1 -d'/'); do
  echo x=$x
done

내가 이것을 실행하는 최상위 디렉토리는 ls 명령을 실행할 때 다음과 같습니다.

ls -l
drwxrwxrwx    4 Jason    users         4096 May  6 06:36 2014-02-02 - Jebby (
drwxrwxrwx    3 Jason    users         4096 May  6 06:09 2014-02-04 - Jebby (
drwxrwxrwx    2 root     root          4096 May  6 06:09 @eaDir
-rw-r--r--    1 Jason    users      3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r--    1 Jason    users      3927603 Jan 26 10:18 DSC01063.JPG

내 for 루프의 결과는 다음과 같습니다.

x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir

보시다시피 for 루프는 각 공백 다음에 디렉터리 이름을 하위 조각으로 나눕니다. 이 예에서는 For 루프가 세 개의 디렉터리에서 세 번만 실행되기를 원합니다.

  1. 2014-02-02 - 제비 (
  2. 2014-02-04 - 제비 (
  3. @eaDir

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

ls가능하다면 쉘 스크립트 의 출력(또는 적어도 파일 이름 부분)을 구문 분석하지 마십시오 .파일 이름에 공백이 포함된 단어 분할 문제는 항상 발생합니다.

디렉토리를 반복하려면 간단한 쉘 글로브를 사용하여 수행할 수 있습니다.

for d in */; do 
  echo "$d"
done

ls명령은 터미널에서 사람이 읽을 수 있는 형식으로 디렉터리 목록을 표시하는 데에만 사용해야 합니다.

답변2

@mikserv 사용하기제안, 넌 할 수있어

cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift 
for x; do
  echo x="${td}/$x"
done

관련 정보