다음 파일이 포함된 디렉터리가 있습니다.
app_conf.jboss.app_hostname_20160913_191141.tgz app_conf.jboss.app_hostname_20160913_194047.tgz app_conf.provider.app_hostname_20160913_194044.tgz app_conf.provider.app_hostname_20160928_071 00 2.tgz app_conf.deployments.ear.app_hostname_20160913_194047.tgz app_conf.deployments.ear.app_hostname_20160915_071005.tgz app_conf.bin . jboss_cluster.app_hostname_20160913_194044.tgz app_conf.bin.jboss_cluster.app_hostname_20160913_194047.tgz app_conf.bin.conf.app_hostname_20160913_194043.tgz app_conf.bin.conf.app_hostname_201609 13 _194047.tgz
동일한 이름 부분("string_name"_YYMMDD_HHMMSS.tgz)을 가진 여러 파일이 있을 수 있으므로 이러한 파일은 날짜별로만 다릅니다.
귀하의 유형에 따라 파일의 마지막 버전만 복사하는 스크립트가 필요합니다.
예:
문자열 이름 1_20160913_194047.tgz.
문자열 이름 1_20160913_194043.tgz.
string_name1_20160913_194047.tgz만 복사해야 합니다.
다른 모든 유형의 파일에 대해 이 작업을 수행합니다...
이제 수동으로 복사합니다.
scp username@host:/tmp/string_name1_20160913_194047.tgz /home/config/
이에 대한 의견을 보내주셔서 감사합니다.
답변1
그리고 zsh
:
cd /home/config && ssh user@host << \EOF | tar xpf -
zsh -c '
cd /tmp || exit
typeset -A seen; files=()
for f (app_conf*_*_*.tgz(On)) {let '\''seen[${f%_*_*}]++'\'' || files+=($f)}
tar cf - $files'
EOF
user
로그인 셸이 host
인 경우 zsh
다음과 같이 단순화할 수 있습니다.
cd /home/config && ssh user@host '
cd /tmp || exit
typeset -A seen; files=()
for f (app_conf*_*_*.tgz(On)) {let '\''seen[${f%_*_*}]++'\'' || files+=($f)}
tar cf - $files' | tar xpf -
아이디어는 파일 목록을 역순으로 처리하고( ) (On)
파일 이름의 이전 부분이 아직 표시되지 않은 경우 _*_*
파일을 선택한다는 것입니다 .
이를 사용하여 파일을 전송하면 tar
모든 파일의 메타데이터를 전송할 수 있다는 장점도 있습니다.
(바라보다산술 표현식에서 연관 배열을 안전하게 사용하는 방법은 무엇입니까?let
여기서 대신 사용하는 이유 ((...))
).