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 - 제비 (
- 2014-02-04 - 제비 (
- @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