![문자열을 사용하여 파일 정렬](https://linux55.com/image/203436/%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%8C%8C%EC%9D%BC%20%EC%A0%95%EB%A0%AC.png)
동일한 형식을 따르는 1000개 이상의 파일이 있는 디렉토리가 있습니다. 예제 파일은 다음과 같습니다.
giroof-doas-ob10roof-L1-202007020832-10.std
2020년은 어디에 있나요
월은 07 입니다
일은 02
시간은 08
분은 32분입니다.
고도는 10입니다.
날짜와 시간을 읽고 이를 동일한 이름의 폴더로 정렬한 다음 고도에 따라 하위 디렉터리로 정렬하는 스크립트를 만들고 싶습니다. 샘플 파일이 폴더에 복사됩니다.
../0208/10.std/
문자열 함수를 사용하여 날짜와 시간을 읽고 해당 폴더를 만들고 디렉터리도 만들 수 있습니다(아래 참조). 내 문제는 "문자열 읽기"를 사용할 때 파일을 복사할 수 없다는 것입니다.
이것은 파일이 있는 곳입니다. (스크립팅 시도를 설명하고 잘라내기 기능을 사용하는 이유를 설명하는 데 도움이 될 수 있습니다.
#/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/giroof-doas-ob10roof-L1-202007020832-10.std
#!/bin/bash
#/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/giroof-doas-ob10roof-L1-202007020832-10.std
list=$(ls /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/*.std)
#echo "$list"
dir="$(cut -d'/' -f8 <<<"$list")"
loca="$(cut -d'-' -f5 <<<"$dir")"
elevstd="$(cut -d'-' -f6 <<<"$dir")"
hello="$(cut -c 7-10 <<< "$loca")"
mkdir /home/lmdjeu/test/hello/$hello
elev="$(cut -c 1-2 <<< "$elevstd")"
#echo "$elev"
for dir in /home/lmdjeu/test/hello/*/;
do
mkdir -- "$dir"/{00.std,01.std,02.std,03.std,04.std,05.std,06.std,07.std,08.std,09.std,10.std,ref};
done
stddir=/home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles
elevdir=/home/lmdjeu/test/hello
이것은 제가 개선하고 싶은 스크립트 영역입니다. 날짜와 시간이 변경되더라도 파일을 적절한 디렉터리와 하위 디렉터리에 복사할 수 있기를 원합니다.
for i in {00..10}; do
cp $stddir/giroof-doas-ob10roof-L1-2020070111*-"$i".std $elevdir/0111/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070112*-"$i".std $elevdir/0112/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070113*-"$i".std $elevdir/0113/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070114*-"$i".std $elevdir/0114/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070115*-"$i".std $elevdir/0115/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070116*-"$i".std $elevdir/0116/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070117*-"$i".std $elevdir/0117/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070118*-"$i".std $elevdir/0118/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070119*-"$i".std $elevdir/0119/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070120*-"$i".std $elevdir/0120/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070121*-"$i".std $elevdir/0121/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070122*-"$i".std $elevdir/0122/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070123*-"$i".std $elevdir/0123/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070200*-"$i".std $elevdir/0200/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070201*-"$i".std $elevdir/0201/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070202*-"$i".std $elevdir/0202/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070203*-"$i".std $elevdir/0203/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070204*-"$i".std $elevdir/0204/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070205*-"$i".std $elevdir/0205/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070206*-"$i".std $elevdir/0206/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070207*-"$i".std $elevdir/0207/"$i".std
cp $stddir/giroof-doas-ob10roof-L1-2020070208*-"$i".std $elevdir/0208/"$i".std
done
cp $stddir/giroof-doas-ob10roof-L1-2020070111*.ref $elevdir/0111/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070112*.ref $elevdir/0112/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070113*.ref $elevdir/0113/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070114*.ref $elevdir/0114/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070115*.ref $elevdir/0115/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070116*.ref $elevdir/0116/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070117*.ref $elevdir/0117/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070118*.ref $elevdir/0118/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070119*.ref $elevdir/0119/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070120*.ref $elevdir/0120/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070121*.ref $elevdir/0121/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070122*.ref $elevdir/0122/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070123*.ref $elevdir/0123/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070200*.ref $elevdir/0200/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070201*.ref $elevdir/0201/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070202*.ref $elevdir/0202/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070203*.ref $elevdir/0203/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070204*.ref $elevdir/0204/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070205*.ref $elevdir/0205/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070206*.ref $elevdir/0206/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070207*.ref $elevdir/0207/ref/
cp $stddir/giroof-doas-ob10roof-L1-2020070208*.ref $elevdir/0208/ref/
답변1
나는 이렇게 할 것이다:
먼저 새 디렉터리의 위치를 정의합니다.
newdir='/home/lmdjeu/test/hello'
이제 cd
모든 파일이 있는 디렉터리로 이동합니다.
cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles
이제 for
루프를 시작하여 이 디렉터리의 파일을 반복합니다 *.std
(추가 작업은 이 for 루프 내에서 수행됩니다).
for i in *.std; do
파일 이름의 날짜 문자열 부분에 날짜 및 시간 값이 필요하며 .
날짜 문자열은 항상 12자리이므로 쉽게 정의할 수 있습니다.
datestring=$(echo "$i" | grep -Eo '[0-9]{12}')
일/시간 값을 정의합니다.
dayhr=$(echo $datestring | cut -c7-10)
고도 값을 정의합니다.
elev=$(echo "$i" | grep -o '[0-9]\+.std')
이제 파일이 이동될 디렉터리를 정의하는 변수를 함께 구성합니다.
loc="$newdir"'/'"$dayhr"'/'"$elev"
마지막으로 디렉터리를 만들고 거기로 파일을 이동한 다음 for
루프를 닫습니다.
mkdir -p "$loc" && mv "$i" "$loc"
done
이런 방식으로 각 파일이 이동될 디렉터리/하위 디렉터리는 항상 파일 이름에서 파생되며 필요한 경우 디렉터리가 생성된 다음 파일이 그 디렉터리로 이동됩니다. 모든 것을 스크립트에 넣으세요:
newdir='/home/lmdjeu/test/hello'
cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles || exit 1
for i in *.std; do
datestring=$(echo "$i" | grep -Eo '[0-9]{12}')
dayhr=$(echo $datestring | cut -c7-10)
elev=$(echo "$i" | grep -o '[0-9]\+.std')
loc="$newdir"'/'"$dayhr"'/'"$elev"
mkdir -p "$loc" && mv "$i" "$loc"
done
더 적은 수의 단계와 변수를 사용하여 이 작업을 수행할 수 있지만 위의 내용이 한 가지 접근 방식을 설명하는 데 도움이 된다고 생각합니다.
답변2
귀하의 요청을 완전히 이해했는지는 모르겠지만 이것이 얼마나 도움이 되는지 시험해보고 싶을 수도 있습니다( bash
셸이 최근 게시물에 있는 것과 같다고 가정).
for i in {00..10}
do for j in {01..02}{00..23}
do echo cp $stddir/giroof-doas-ob10roof-L1-202007"$j"*-"$i".std $elevdir/"$j"/"$i".std
done
echo cp $stddir/giroof-doas-ob10roof-L1-202007"$j"*.ref $elevdir/"$j"/ref/
done
j
루프 에서 날짜/시간을 취향에 맞게 조정하세요. 단순화를 위해 모든 계산 파일을 시도 cp
하고 존재하지 않는 파일에서는 실패합니다. 필요한 경우 stderr을 억제할 수 있습니다. 또는 파일 이름 구성을 관련 파일 이름으로 구체화합니다.
사전 디렉터리 생성을 위해 다음을 시도해 볼 수 있습니다.
cd /home/lmdjeu/qdoas-test/ob10roof/fitting/stdfiles/
for FN in *
do IFS=".-" read X X X X loca elev std X <<< "$FN"
# hello="${loca:6:4}"
# elevstd="$elev$std"
echo mkdir -p -- "/home/lmdjeu/test/hello/${loca:6:4}/"{{00..10}.std,ref}
done
두 경우 모두 echo
보기에 마음에 들면 삭제하세요.