2012-05-16 2 views
3

많은 수의 이미지 파일을 일괄 처리해야하는 프로젝트에서 작업하고 있습니다. 작업을 쉽게하기 위해 나는 n 디렉토리를 만들고 사용자 입력을 기반으로 m 개의 파일을이 스크립트로 옮길 것입니다.디렉토리를 가로 지르는 쉘 스크립트

내 문제는 이제 쉘 스크립트를 통한 디렉토리 탐색을 이해하는 것입니다.

가 나는 두 개의 내부 폴더를 포함 whcih Pano2 폴더 내부를 실행하면

dirlist=$(find $1 -mindepth 1 -maxdepth 1 -type d) 

for dir in $dirlist 
do 
    cd $dir 
    echo $dir 
    ls 
done 

위에서 설명한 정렬 스크립트의 마지막에이 조각을 추가 한, 나는 항상 오류가 발생했습니다

./dirTravel: line 9: cd: Pano2/05-15-2012-2: No such file or directory 

그러나, 그 후에 지정된 디렉토리에서 파일 목록을 가져옵니다.

경고의 배경은 무엇입니까? ls 다음에 cd ../을 추가하면 Pano2/안에 폴더 목록이 표시되지만 파일 자체는 표시되지 않습니다.

+2

이름에 공백이 있으면 솔루션이 폭파합니다. 이런 종류의 질문은 일주일에 2-3 배로 질문을받습니다. 잠시 시간을내어'[bash] find while'을 검색하십시오 (루프에는 사용하지 마십시오). 행운을 빕니다. – shellter

+0

@shellter 폴더 이름은 스크립트에 의해 프로그래밍 방식으로 생성되며 파일 이름이 없습니다. 귀하의 요점은 그렇지 않으면 유효하지만, 실제로이 상황에서 작동하지 않습니다. – Jason

+0

@shelter - while을 사용하면 파일 이름에 공백이있을 경우 파일이 끊어지는 것을 막을 수 있지만 이름에 줄 바꿈이있는 경우에는 유효하지 않습니다. – jordanm

답변

3

내 생각 엔 두 단계로 깊숙이 들어갈 수 있지만 한 단계 위로 만 돌아 오는 것 같습니다. ls 뒤에 cd ../..을 추가하거나 pushdpopd을 대신 사용하십시오. @shellter가 지적 하듯이 해당 디렉토리에 공백이있는 경우

for dir in $dirlist 
do 
    pushd $dir 
    echo $dir 
    ls 
    popd 
done 

, 다음과 같은 일이 더 잘 작동 될 수 있습니다 :

find $1 -mindepth 1 -maxdepth 1 -type d | while read -r dir 
do 
    pushd "$dir" # note the quotes, which encapsulate whitespace 
    echo $dir 
    ls 
    popd 
done 
3

을 내가 전환 서브 쉘을 사용하는 것이 좋습니다 예를 들어

디렉토리 :

dirlist=$(find $1 -mindepth 1 -maxdepth 1 -type d) 

for dir in $dirlist 
do 
    (
    cd $dir 
    echo $dir 
    ls 
) 
done 

하위 쉘 내부의 코드는 상위 쉘에 영향을주지 않습니다. o '돌아 오는 법'에 대해 아무런 문제없이 디렉토리를 변경할 수 있습니다.

디렉토리 이름에 공백, 개행 문자 또는 기타 예상치 못한 어색한 문자가 포함될 수있는 경우 전체 프로세스가 고민하는 표준주의 사항이 있습니다. 이식 가능한 파일 이름 문자 집합 ([-_.A-Za-z0-9])을 계속 사용하면 작성한대로 문제가 발생하지 않습니다.

+0

이름에 공백이 포함 된 디렉토리에서는 작동하지 않습니다. – jordanm

+0

잘 찾아 냈습니다; 내 마지막 단락은 그 문제를 정확하게 다룹니다. –

2

실제로 ls 명령을 실행하기 위해 디렉토리로 이동해야하는 이유가 없습니다. 다음과 같은 작업을해야합니다 : 그건 그냥 예를 들어 있었다면

find "$1" -mindepth 1 -maxdepth 1 -type d -exec ls {} \; 

, 당신은 정말 작업 디렉토리에 따라 다른 명령을 실행, 당신은 떠들썩한 파티를 사용할 수 있습니다 -c와 간부 :

find "$1" -mindepth 1 -maxdepth 1 -type d -exec bash -c 'cd "$1"; echo "$1"; ls' -- {} \; 

bash -c 호출은 서브 쉘을 생성하므로 현재 쉘의 디렉토리를 변경하는 것에 대해 걱정할 필요가 없습니다.

관련 문제