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 루프가 세 개의 디렉터리에 대해 세 번만 실행되기를 원합니다.
- 2014-02-02 - JB (
- 2014-02-04 - JB (
- @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