Como gravar em um diretório como parte do shell script e fazer uma contagem de palavras dos arquivos?

2

Estou tentando obter a pasta mais recente dentro do meu diretório em machineB e machineC. Então eu vim com o comando abaixo, que vai me encontrar a pasta mais recente dentro -

'/bat/data/snapshot'

E essa pasta mais recente estará na forma de YYYYMMDD . Abaixo está o meu script de shell -

#!/bin/bash

readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

echo $dir1
echo $dir2

Agora, dir1 será exibido em machineB as -

/bat/data/snapshot/20131222

E dir2 será semelhante a machineC as -

/bat/data/snapshot/20131222

Agora preciso cd nesses dois diretórios e faço uma contagem de palavras dos arquivos e armazeno-os na variável length1 e length2 -

ls | wc -l

Eu pensei que posso fazer isso, mas eu pensei antes que eu preciso de cd para esses dois diretórios e, em seguida, fazer uma contagem de palavras -

echo $dir1
echo $dir2

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls | wc -l "$dir1")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls | wc -l "$dir2")

echo $length1
echo $length2   

Então, agora eu não sei como fazer cd nesses dois diretórios e então fazer um ls e encontrar a contagem de arquivos como parte do script de shell?

    
por arsenal 24.12.2013 / 08:11

2 respostas

3

Sua melhor aposta será escrever um script em vez de tentar passar um grande comando feio via ssh arguments. Torna-se muito difícil executar comandos complexos via argumentos ssh porque o ssh junta todos os argumentos em uma string separada por espaço e, em seguida, os divide novamente no final remoto.

Agora, usar um script não é tão ruim quanto parece e é bem simples, já que você pode passar o script para STDIN.

function host_file_count() {
 ssh -o StrictHostKeyChecking=no david@"$1" bash -s <<'EOI'
  dir_last="$(ls -dt1 /bat/data/snapshot/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n 1)"
  count="$(ls -1 "$dir_last"/ | wc -l)"
  echo "$(hostname): $dir_last=$count"
EOI
}
host_file_count machineB
host_file_count machineC

Basicamente isso apenas alimenta o script no STDIN de ssh , que por sua vez passa para STDIN de bash -s no host remoto.
A outra vantagem de fazer isso dessa forma é que você não precisa executar vários comandos ssh para obter o resultado.

Observe que muitos dirão para não analisar ls . Então, abaixo está outro script que faz o mesmo, mas sem usar ls .

function host_file_count() {
 ssh -o StrictHostKeyChecking=no david@"$1" bash -s <<'EOI'
  dirs=( /bat/data/snapshot/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ) # get a list of matching directories
  dir_last="${dirs[${#dirs[@]} - 1]}" # get the last item in the list
  files=( "$dir_last"/* ) # get the list of files in directory
  count="${#files[@]}" # size of that list
  echo "$(hostname): $dir_last=$count"
EOI
}
host_file_count machineB
host_file_count machineC

nota: ambos são completamente não testados, pode haver pequenos erros, mas o princípio está

    
por 24.12.2013 / 08:56
0

Seu shell local na interpretação do pipe, além de você ter a variável no comando errado:

len1=$( ssh ... user@host sh -c "ls '$dir1' | wc -l" )
    
por 24.12.2013 / 08:39