
먼저 저의 지식 부족에 대해 사과드리고 싶습니다. 이것은 말 그대로 나의 첫 번째 bash 스크립트이며 나의 Linux 지식은 기본적으로 존재하지 않습니다. 설명적인 답변을 주시면 감사하겠습니다. 나는 방법뿐만 아니라 이유를 배우고 싶습니다.
하루에 여러 번 수행해야 하는 지루한 프로세스를 자동화하는 스크립트를 작성하려고 합니다. 즉, 이 스크립트는 특정 요구 사항에 따라 파일 세트를 준비해야 합니다. 스크립트는 템플릿 파일을 이동하고 버전 번호를 할당하거나 특정 디렉토리 내부에 있는 내용을 기반으로 새 버전 번호를 사용하여 기존 파일을 복사해야 합니다(예: 비어 있으면 생성, 거기에 뭔가 있으면 복사).
예를 들어 파일 이름은 다음과 같습니다.
YYYYMMDD_##_username_testfile.json
여기서 ##(버전 번호)는 첫 번째 생성의 경우 01이어야 하고 복사본의 경우 02, 그 이후의 복사본의 경우 03이어야 합니다. 단일 디렉터리에는 날짜와 순서가 서로 다른 이러한 파일이 10개 이상 포함될 수 있습니다. 버전 번호 및 동일한 형식을 사용하지만 testfile.json이 아닌 다른 것으로 끝나는 기타 파일
버전 번호가 가장 높은 testfile.json으로 끝나는 파일에 대해 "test" 디렉터리에서 스크립트를 찾는 방법을 찾을 수 없는 것 같습니다. 발견된 경우 버전 번호를 변수/매개 변수로 추출하여 전달할 수 있습니다. cp 시퀀스로 돌아갑니다.
이 시점에서는 어떤 명령을 사용해야 할지조차 모르겠습니다. 인터넷은 grep부터 awk, 나열 및 정렬까지 모든 것을 제공합니다... 머리가 어질어질합니다!
어떤 도움이라도 주시면 감사하겠습니다. 모든 식별 정보를 제거했습니다. 추가 정보가 필요하면 알려주시기 바랍니다.
답변1
여러 단계로 나누어 보겠습니다.
다음 숫자를 반환하는 함수를 작성하겠습니다. 효율성의 극대화보다는 단순함을 지향하겠습니다.
디렉터리 이름을 지정해야 합니다.
testfile.json
파일 이름의 일부를 지정해야 합니다.
해당 디렉터리에서 해당 끝으로 끝나는 모든 파일을 찾아야 합니다.
매개변수는 $1, $2 등을 사용하여 함수에 전달됩니다.
getnum(){
ls "$1" | grep "$2\$"
}
_
구분 기호로 사용하여 두 번째 필드만 꺼내려면 cut을 사용합니다 . (제가 이 작업을 수행할 경우 grep 및 cut 대신 sed를 사용하고 다른 사람들은 awk를 사용할 수도 있지만 여기서는 단순성을 추구합니다.)
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2
}
숫자순으로 정렬하려면 sort를 사용하세요.
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}
첫 번째 값만 얻으려면 head를 사용하세요.
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
}
이를 마무리하여 지역 변수의 값을 얻습니다.
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}
값이 없으면 이전 값을 0으로 설정합니다. 이전 값보다 하나 더 많은 2자리 숫자를 인쇄합니다.
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
if [ "$oldnum" = "" ]
then
oldnum=0
fi
printf "%02d\n" $(($oldnum+1))
}
이 경우 $((oldnum+1))
확장되는 것처럼 oldnum이 설정되지 않은 테스트를 생략할 수도 있었습니다 . $((+1))
$((${oldnum:-0}+1))과 같은 표현식을 사용할 수도 있습니다. 자세한 내용은 설명서를 참조하세요.
그런 다음 다음과 같은 기능을 사용할 수 있습니다
dir=somewhere/logs
ext=testfile.json
cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"