폴더 및 목록 파일을 반복


14

'sample'이라는 폴더가 있으며 3 개의 파일이 있습니다. 샘플 폴더 내에서 이러한 파일을 읽고 curl을 사용하여 HTTP 사이트에 게시하는 쉘 스크립트를 작성하고 싶습니다.

폴더 안에 파일을 나열하기 위해 다음을 작성했습니다.

for dir in sample/*; do
        echo $dir;
        done

그러나 그것은 다음과 같은 결과를줍니다.

sample/log

sample/clk

sample/demo

상위 폴더가 첨부되어 있습니다. 부모 폴더 이름없이 다음과 같이 출력을 원합니다.

log

clk

demo

어떻게해야합니까?


1
먼저 'cd'를 사용하십시오. 'curl'이 필요한 경우에도 디렉토리를 입력해야합니다. 또한 echo ${dir##*/}경로를 벗어난 데 사용할 수 있습니다.
eexpress

답변:


32

basename파일의 선행 경로를 제거하는 데 사용하십시오 .

for file in sample/*; do
    echo "$(basename "$file")"
done

왜 그렇지 않습니까?

( cd sample; ls )

3

쉘이 그것을 지원한다고 가정하면 매개 변수 확장을 사용할 수 있습니다

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

또는 해당 디렉토리로 변경하고 목록을 작성하십시오.


1
--여기 필요하지 않습니다. 첫 번째 인수는 대시가없는 고정 문자열입니다.
Kusalananda

또한 ${parameter##pattern}모든 POSIX 쉘에서 지원됩니다.
Kusalananda

2

* nix 시스템은 거의 모든 문자가 파일 이름의 일부가 될 수 있으므로 (공백, 줄 바꿈, 쉼표, 파이프 기호 등 포함) 쉘 스크립트에서 "ls"명령의 출력을 구문 분석해서는 안됩니다. 신뢰할 수 없습니다. ls 출력을 구문 분석하지 않아야하는 이유를 참조하십시오 .

"찾기"를 사용하여 파일 목록을 작성하십시오. Bash를 사용하는 경우 "find"의 출력을 배열에 삽입 할 수 있습니다. 아래 예는 작동하지 않는 "curl"명령을 사용했다는 경고와 함께!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F data=@"$file" UPLOAD_ADDRESS
    done
fi

여기 디렉토리는 무엇입니까? $ '\ 0'? 변수에있는 디렉토리를 전달하고 싶습니다 ...
Soylent Graham

searchDir은 디렉토리 변수입니다. "-d $ '\ 0'"은 읽기 명령의 분리 문자를 널로 설정합니다.
bb_referee 2

sh 쉘에서 동일한 것을 어떻게 달성합니까? #! / bin / sh를 사용하고 있습니다
Ayusman

1

디렉토리로 수행하려는 작업에 따라 다릅니다.

디렉토리인지 여부를 확인하지 않고 단순히 이름을 인쇄하려면 ls를 사용할 수 있습니다.

ls -1 sample

필터를 사용할 수 있기 때문에 더 잘 찾을 수 있습니다.

find sample -type d -maxdepth 1 -printf '%f\n'

파일에서 명령을 실행하려면 for 루프가 아닌 find를 사용해야합니다.

find sample -type d -maxdepth 1 -exec basename {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.