![정규식을 사용하여 복사할 소스 파일의 이름을 얻는 방법은 무엇입니까?](https://linux55.com/image/183341/%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%B3%B5%EC%82%AC%ED%95%A0%20%EC%86%8C%EC%8A%A4%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
이름에 다음과 같은 타임스탬프가 포함된 파일을 복사하고 싶습니다.
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")"
이는 패턴과 일치하는 경로 이름의 확장된 목록을 보유하기 위해 위치 인수를 사용하여 위 루프의 첫 번째 반복을 실행하는 것과 기본적으로 동일합니다.