몇 년 동안 BASH를 사용해 왔지만 BASH 스크립팅에 대한 내 경험은 상대적으로 제한적입니다.
내 코드는 다음과 같습니다. 현재 디렉토리 내에서 전체 디렉토리 구조를 가져 와서로 복제해야합니다 $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
문제는 내 파일 구조의 샘플입니다.
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
공백을 참고하십시오 : -S 그리고 for
단어별로 매개 변수를 사용하므로 스크립트의 출력은 다음과 같습니다.
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
그러나의 출력에서 전체 파일 이름 (한 번에 한 줄)을 가져 와야 find
합니다. 또한 find
각 파일 이름 주위에 큰 따옴표 를 넣으 려고했습니다 . 그러나 이것은 도움이되지 않습니다.
for DIR in `find . -type d -printf "\"%P\"\040"`
그리고이 변경된 줄로 출력 :
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
이제 gstreamer
다음과 유사한 구조로 각 파일에 대해 보다 복잡한 명령을 실행하고 싶기 때문에 이와 같이 반복 할 수있는 방법이 필요합니다 . 어떻게해야합니까?
편집 : 각 디렉토리 / 파일 / 루프마다 여러 줄의 코드를 실행할 수있는 코드 구조가 필요합니다. 확실하지 않으면 죄송합니다.
솔루션 : 처음에 시도했습니다 :
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
이것은 대부분 잘 작동했습니다. 그러나 나중에 파이프가 서브 쉘에서 while 루프를 실행하기 때문에 루프에 설정된 모든 변수를 사용할 수 없으므로 오류 카운터를 구현하기가 매우 어려웠습니다. 내 최종 솔루션 ( 이 답변에서 SO ) :
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
나중에 루프에서 변수를 조건부로 증가시켜 나중에 스크립트에서 계속 사용할 수 있습니다.
/
인쇄 할 수없는 문자 만 허용 합니다. 그러나 모든 것을 제외 /
하고 는 허용 \0
되므로 허용 해야합니다.