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 - JB (
  2. 2014-02-04 - JB (
  3. @eaDir

내가 뭘 잘못했나요?

답변1

ls가능하다면 쉘 스크립트의 출력(또는 최소한 파일 이름 부분)을 구문 분석하지 마십시오.파일 이름에 공백이 포함되어 있으면 항상 단어 분할 문제가 있습니다.

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

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

관련 정보