디렉터리를 반복하고 디렉터리 이름과 일치하도록 하위 디렉터리의 파일 이름을 바꾸는 스크립트를 작성하려고 합니다. 디렉토리 이름에 공백이 포함되어 있으면 이름이 분할되어 필요한 대로 아무 것도 할 수 없는 문제가 있습니다.
예를 들어 폴더 구조는 다음과 같습니다.
TopLevel
->this is a test
-->test.txt
지금까지 내 스크립트는 다음과 같습니다
#!/bin/sh
topLevel="/dir1/dir2/TopLevel"
for dir in $(ls $topLevel)
do
echo $dir # for testing purposes to make sure i'm getting the right thing
# Get name of directory - i know how to do this
# Rename file to match the name of the directory, with the existing extension - i know how to do this
done
내 예상 결과는
/dir1/dir2/TopLevel/this is a test
그러나 실제 출력은
this
is
a
test
누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 오랜만에 쉘스크립팅을 해봤습니다. 이 스크립트를 한 번에 하나씩 완료하려고 하는데 반복을 완료하는 데 막힌 것 같습니다.
답변1
이것이 이 작업을 수행해야 하는 주요 이유 중 하나입니다.출력을 구문 분석하지 마십시오.ls
. 쉘 글로브만 사용하는 경우 다음을 수행할 수 있습니다.
for dir in /dir1/dir2/TopLevel/*/
do
echo "$dir" ## note the quotes, those are essential
done
논평
for dir in /dir1/dir2/TopLevel/*/
단지 디렉토리를 반복하는 것 대신에 제가 어떻게 사용하고 있는지 주목하세요for dir in /dir1/dir2/TopLevel/*
. 디렉토리와 파일을 원하면for f in /dir1/dir2/TopLevel/*
.주변 따옴표는
$dir
필수적이며 특히 변수에 공백이 포함된 경우 변수를 항상 인용해야 합니다.
추가 자료: