이름에 다음과 같은 타임스탬프가 포함된 파일을 복사하고 싶습니다.
image-abc-20201113-1703.bin
위치에 /my/path/for/the/image
.
이 이미지를 장치에 복사하고 싶습니다 - mydevice
저장 위치~/.ssh/config
파일 이름이 일정하지 않기 때문에 스크립트에 하드코딩할 수 없습니다.
그래서 정규식을 사용하여 다음과 같이 파일을 복사합니다.
scp /my/path/for/the/image/image-abc-*.bin mydevice:flash:<file_name>
따라서 복사되는 소스 파일의 이름을 언급해야 합니다.file_name
이 목표를 어떻게 달성할 수 있나요?
답변1
올바른 대상 파일 이름을 제공해야 한다고 생각한다면 그렇게 하면 안 된다고 생각합니다.필요그런 다음 파일 이름 와일드카드 패턴(이것은 정규 표현식이 아닙니다.) 루프에서:
for pathname in /my/path/for/the/image/image-abc-*.bin
do
[ -e "$pathname" ] &&
scp "$pathname" "mydevice:flash:$(basename "$pathname")"
done
이름이 주어진 와일드카드 패턴과 일치하는 모든 파일을 복사합니다. 이 -e
테스트는 $pathname
호출 전의 경로 이름이 실제로 존재하는지 확인합니다 scp
(일치하는 이름이 없으면 패턴은 확장되지 않은 상태로 유지됩니다).
이 basename
유틸리티는 여기서 경로 이름의 파일 이름 부분을 추출하는 데 사용됩니다. 그러면 이는 대상 파일 이름으로 사용됩니다. "${pathname##*/}"
명령 대체 호출 대신 매개변수 대체를 사용할 수도 있습니다 basename
.
패턴이 단일 파일에만 일치한다고 확신하는 경우에도 다음을 수행할 수 있습니다.
set -- /my/path/for/the/image/image-abc-*.bin
[ -e "$1" ] && scp "$1" "mydevice:flash:$(basename "$1")"
이는 패턴과 일치하는 경로 이름의 확장된 목록을 보유하기 위해 위치 인수를 사용하여 위 루프의 첫 번째 반복을 실행하는 것과 기본적으로 동일합니다.