Dado que o conjunto de comandos smbclient não implementa um shell completo, minha melhor idéia (curta de estocar os compartilhamentos e usar os utilitários de shell locais) é "analisar ls".
Em um nível alto, você poderia substituir o comando single smbclient por dois:
-
smbclient ... dir
- para obter a listagem de arquivos -
smbclient ... get
- para obter o arquivo mais antigo
Como não tenho um ambiente semelhante ao seu, aqui estão as "entranhas" do que eu substituiria:
filename=$(smbclient '\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; dir" | awk -f parse-smbclient-ls)
smbclient '\'$IP'\C$' -W *** -U ***%*** -c "cd \*****\*****; get $filename"
Onde o conteúdo de parse-smbclient-ls seria:
BEGIN {
"date +%s" | getline oldesttime
}
/ N / {
# size thu mar dd dd:dd:dd dddd
if (match($0, / N +[[:digit:]]+ +[[:alpha:]]{3} [[:alpha:]]{3} +[[:digit:]]+ [[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4}$/)) {
timestamp=sprintf("%s %s %s %s %s", $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF)
filename=substr($0, 3, RSTART-3)
# trim trailing whitespace -- *** hope the real filename doesn't end in whitespace
sub(/ +$/, "", filename);
("date --date='"timestamp"' +%s") | getline seconds
if (seconds < oldesttime) {
oldesttime=seconds
oldestfile=filename
}
}
}
END {
print oldestfile
}
Percorrendo o script do awk:
- inicializa o valor da data mais antiga atualmente para a hora atual; espero que o arquivo mais antigo tenha pelo menos um segundo de idade
- Se a linha corresponder a
/ N /
, pareceremos estar olhando para um arquivo normal (versus diretório) - se a linha corresponder à expressão regular fornecida (o que tenta ter o cuidado de corresponder apenas ao N, tamanho em bytes e carimbo de data / hora, seguido do final da linha
$
), então - extrair o registro de data e hora
- extrair o nome do arquivo
- delimitar o espaço em branco no nome do arquivo
- solicite a data do GNU para converter o registro de data e hora do arquivo em segundos
- se o arquivo atual for mais antigo do que o que temos, salve o registro de data e hora e o nome do arquivo
- no final, imprima o nome de arquivo mais antigo
Observe que isso tem pelo menos dois problemas que eu conheço:
- se o nome real do arquivo terminar em espaço em branco (como é perfeitamente legal, mesmo no Windows, acredito), então esse processo falhará duas maneiras - o script awk corta o espaço em branco e o comando A substituição também tira o espaço em branco.
- arquivos que contêm (algum tipo de) caracteres especiais são renomeados; por exemplo, quando criei um arquivo chamado
foo$'\n'bar
, o comando smbclientdir
me mostrou:FKCEWC~I
como o nome do arquivo.