
'sample'이라는 폴더가 있고 그 안에 3개의 파일이 있습니다. 샘플 폴더 내에서 이러한 파일을 읽고 컬을 사용하여 HTTP 사이트에 게시하는 쉘 스크립트를 작성하고 싶습니다.
폴더 내의 파일을 나열하기 위해 다음을 작성했습니다.
for dir in sample/*; do
echo $dir;
done
그러나 그것은 나에게 다음과 같은 결과를 제공합니다.
sample/log
sample/clk
sample/demo
그 안에 상위 폴더를 첨부하고 있습니다. 다음과 같이 출력을 원합니다(상위 폴더 이름 없이).
log
clk
demo
어떻게 해야 하나요?
답변1
basename
파일에서 선행 경로를 제거하는 데 사용합니다 .
for file in sample/*; do
echo "$(basename "$file")"
done
그래도 안되는 이유:
( cd sample; ls )
답변2
쉘이 이를 지원한다고 가정하면 매개변수 확장을 사용할 수 있습니다.
for path in sample/*; do
printf -- '%s\n' "${path##*/}"
done
아니면 해당 디렉토리로 변경하여 목록을 작성할 수도 있습니다.
답변3
디렉토리로 무엇을 하려는지에 따라 다릅니다.
디렉토리인지 여부를 확인하지 않고 단순히 이름을 인쇄하려면 ls를 사용할 수 있습니다.
ls -1 sample
필터를 사용할 수 있으므로 더 나은 결과를 찾을 수 있습니다.
find sample -type d -maxdepth 1 -printf '%f\n'
파일에 대해 명령을 실행하려면 for 루프가 아닌 find를 사용해야 합니다.
find sample -type d -maxdepth 1 -exec basename {} \;
답변4
*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