정규식을 사용하여 복사할 소스 파일의 이름을 얻는 방법은 무엇입니까?

정규식을 사용하여 복사할 소스 파일의 이름을 얻는 방법은 무엇입니까?

이름에 다음과 같은 타임스탬프가 포함된 파일을 복사하고 싶습니다.

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")"

이는 패턴과 일치하는 경로 이름의 확장된 목록을 보유하기 위해 위치 인수를 사용하여 위 루프의 첫 번째 반복을 실행하는 것과 기본적으로 동일합니다.

관련 정보