Script KSH com dificuldade para ler variáveis por linha

1

Para começar, não sou o criador de scripts mais avançado. Fui solicitado a criar um script que procuraria em um diretório por arquivos de impressão com mais de 14 dias e movê-los para um diretório de arquivamento. Existem vários diretórios que terão diretórios de arquivos correspondentes com eles. Para testar isso, criei dois arquivos de texto que teriam o diretório de origem e o diretório de destino. As coisas correram bem quando havia apenas um caminho de diretório em cada arquivo. No entanto, quando adicionei outro caminho de diretório a cada arquivo, o script moveu a primeira pasta de arquivamento para a segunda pasta de arquivamento.

Os arquivos encontrados na primeira linha de printdirs.txt devem ser movidos para o caminho encontrado na primeira linha de archivedirs.txt . Em seguida, o loop é executado novamente e os arquivos encontrados no caminho na segunda linha de printdirs.txt devem ser movidos para o caminho encontrado na segunda linha de archivedirs.txt e assim por diante.

Aqui está o que o script parece:

#!/usr/bin/ksh

printlist=/u/lawson/stage/Scripts/printdirs.txt
archivelist=/u/lawson/stage/Scripts/archivedirs.txt

# Checking the archive list and moving files

for i in $(cat $printlist) ; do
    cd $i   
    /usr/bin/find . -mtime +14 -type f -exec mv "{}" $(cat $archivelist) \;

done

Veja o que os arquivos de texto contêm:

$ cat printdirs.txt
/u/lawson/law/print/lawson/tim/1
/u/lawson/law/print/dgfinance/monday190/1

$ cat archivedirs.txt
/u/lawson/law/print/archive
/u/lawson/law/print/archive2

Como posso fazer o script fazer um loop para cada linha correspondente e não copiar a pasta "archive" para a pasta "archive2"?

UPDATE: atualizado o script com a ajuda de terdon. Aqui está a saída depois de adicionar o comando echo:

# ./printarchive2.ksh 
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /lawson/tim/1      /u/lawson/law/print/archive {} +
/usr/bin/find /u/lawson/law/prin -mtime +14 -type f -exec mv /dgfinance/monday190/1     /u/lawson/law/print/archive2 {} +

O script que o terdon queria que eu usasse removia o "t" dos caminhos do diretório. Eu testei mudando o "t" para um "n". Ele removeu a letra "n" dos meus caminhos de diretório. Existe outra maneira de indicar um separador de campo de abas que o shell Korn pode ler, porque aparentemente isso não funciona no KSH.

    
por Uncle Jay Razz 29.06.2016 / 17:42

1 resposta

2

Eu usaria paste aqui. É uma ferramenta bacana que pode ser usada para combinar arquivos:

$ paste printdirs.txt archivedirs.txt 
/u/lawson/law/print/lawson/tim/1    /u/lawson/law/print/archive
/u/lawson/law/print/dgfinance/monday190/1   /u/lawson/law/print/archive2

Como você pode ver acima, ele imprimirá linhas sucessivas de ambos os arquivos, separadas por tabulações. A separação por tabulação é muito útil se os nomes dos diretórios puderem conter espaços. Agora, você pode iterar sobre a saída paste para fazer sua coisa:

#!/usr/bin/ksh

printlist="/u/lawson/stage/Scripts/printdirs.txt"
archivelist="/u/lawson/stage/Scripts/archivedirs.txt"

paste "$printlist" "$archivelist" | while IFS=$'\t' read source dest; do
    /usr/bin/find "$source" -mtime +14 -type f -exec mv -t "$dest" {}  +
done

Note que eu i) removi o cd , não há necessidade, find pode ser executado no alvo de qualquer lugar; ii) removeu a sintaxe for i in $(cat foo) , que geralmente deve ser evitada e iii) substituiu -exec ... \; por -exec + , que é mais eficiente (tentará e combinará mv chamadas, e é por isso que o -t "$dest" é necessário) .

Se o seu mv não suportar a opção -t , altere o comando find de volta para:

/usr/bin/find "$source" -mtime +14 -type f -exec mv "$source" "$dest" \;
    
por 29.06.2016 / 18:08

Tags