파일 이름 및 날짜 비교를 기반으로 원격 파일을 복사하는 스크립트

파일 이름 및 날짜 비교를 기반으로 원격 파일을 복사하는 스크립트

다음 파일이 포함된 디렉터리가 있습니다.

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 002.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).

유형에 따라 파일의 마지막 버전만 복사하는 스크립트가 필요합니다.

예:

string_name1_20160913_194047.tgz.

string_name1_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여기 대신에 왜 우리가 사용하고 있는지 ((...))).

관련 정보