2011-01-26 5 views
1

현재 특정 작은 폴더를 반복하면서 작은 디렉토리에있는 파일 만 출력합니다. 불행히도 파일 이름 변수에 액세스해야하므로 find을 사용할 수 없습니다.쉘 스크립트 : 파일이 디렉토리이고 디렉토리가 아닌 파일인지 확인

for filename in "/var/myfolder/*" 
do 
    if [ -f "$filename" ]; then 
    echo $filename # Is file! 
    fi 

done; 

을 내가 잘못 뭐하는 거지 :

다음은 작동하지 않습니다 내 현재의 조각을,입니까? 주위의/var/MyFolder에/* (이유 존재 따옴표를 넣어 대신 각각의 단일 문자열이 별도의 문자열

답변

4

당신은 탈출하지 않아야을 파일 이름의 모든 파일을 만들고 있다는 것입니다/var에 따옴표없이

1

시도/MyFolder에/*, 의미, 올바르게 파일 이름의 원하는 목록으로 쉘에 의해 확장하는 식의 순서를 이중 따옴표를 제거해야합니다.

+0

아니요, 모든 파일은 * 단일 문자열이 아닙니다. 별표를 문자 그대로 만들었고 glob을 확장하지 않습니다. –

+0

맞습니다. 리터럴 별표입니다. "echo $ filename"에서 확장됩니다. – vmpstr

1

for filename in "/var/myfolder/*"

를 따옴표는 하나의 거대한를 얻을 의미 해당 glob 문자열 -직전에 echo _ $filename _을 붙이십시오.은 유용하지 않은 무언가로 '루프'를 한 번만 통과한다는 것을 발견했습니다.

는 따옴표를 제거하고 다시 시도하십시오 : 당신이 잘못하고있는 것은 find를 사용하지 않는

+0

따옴표 안에는 glob가 아닙니다. 별표는 리터럴입니다. –

+0

@Dennis Williamson, 고마워요. 'echo'는 쉘이 할당 이전에 별표를 확장 한 전체 디렉토리 내용을 출력했기 때문에 나는 생각했다. echo가 실행될 때 쉘이 별표를 확장한다는 것을 깨닫지 못했습니다. :) – sarnold

2

. 파일 이름은 {}을 사용하여 검색 할 수 있습니다.

find /var/myfolder -maxdepth 1 -type f -exec echo {} \; 
-1

이러한 번거 로움을 찾아서 피할 수 있습니다.

for i in $(find /var/myfolder -type f) 
do 
echo $(basename $i) 
done 

이 상황이 당신의 상황과 관련이 없습니까? 깊이를 제한하려면 -maxdepth 옵션을 사용하십시오.

+1

공백을 포함하는 파일 이름이 있으면'for'와'find'를 그렇게 사용하면 실패합니다. 'find -exec' 또는'find -print0 | xargs -0' 또는'find | IFS = $ '\ n'read -r' 또는'IFS = $ '\ n'read -r ... done <<(find)'입니다. –

+0

데니스에게 감사드립니다. 매우 유효한 포인트. –

관련 문제