Eu tenho um processo que cria progressivamente diretórios, atribui um índice em ordem crescente para eles e armazena os resultados no diretório da última iteração, aquele com o maior índice. Como o número de iterações necessárias para concluir o processo varia de acordo com o conjunto de dados, não posso prever o índice do último diretório. Por exemplo:
#Dataset 1 may produce
ls -d Dir*
... Dir4 Dir5
e
#Dataset 2 may produce
ls -d Dir*
... Dir34 Dir35
Eu acho que eu poderia criar e Array que contém o nome de todos os diretórios, fazer uma cópia do último e remover todos os diretórios
ARR=($(ls -d Dir*))
cp ${ARR[@]:(-1)} LastDirectory #Preserve my results in LastDirectory
rm Dir*
Mas esta é uma maneira de me atirar no pé. Digamos que o programa leve dez iterações para terminar. Então, Dir10 conterá meus resultados. Se eu listar os diretórios e passá-los para o array, o Dir10 não estará na última posição e será eliminado. Este é o tipo de comportamento imprevisível que eu quero evitar!
#You can copy-paste this piece of code to replicate the problem:
mkdir Dir1 Dir2 Dir3 Dir4 Dir5 Dir6 Dir7 Dir8 Dir9 Dir10
ls -d Dir*
Dir1 Dir10 Dir2 Dir3 Dir4 ... Dir8 Dir9
ARR=($(ls -d Dir*))
echo ${ARR[@]:(-1)}
Dir9
Existe uma maneira de salvar todos os diretórios, exceto aquele com o maior índice?
NOTA: Pensei em usar datas de criação de diretórios, mas parece que essa opção não é suportada no Linux.
ls -t
.Respostas:
No meu Ubuntu há
-v
opção parals
. Deman ls
:Como alternativa, a
-V
opçãosort
também se destina a lidar com números de versão. Eu decidi incluí-lo na minha resposta porquesort
funciona como um filtro. Pode ser útil no caso geral (por exemplo, quando você obtém sua lista de diretórios defind
ou de um arquivo de texto).Escreva sua definição de array assim:
ou isto:
EDIT: comentário dave_thompson_085 dá simplificação útil:
fonte
-r
a qualquer um coloca o item desejado em primeiro lugar, acessível com mais conveniente${ARR[1]}
Você pode (manualmente) criar um dir chamado
Dir1000
antes de iniciar o processo, e, em seguida, ele criaDir1001
,Dir1002
etc.?Se o processo funcionar dessa maneira, seria óbvio e fácil?
fonte
Como você não pode alterar o programa que cria os diretórios, como você mencionou, você pode fazê-lo gravar em diretórios de saída diferentes para cada tarefa? Então você teria
Caso contrário, é provavelmente mais seguro examinar o conteúdo dos diretórios. Existem diferenças entre os diretórios intermediários e o último que contém os resultados? Se os resultados estiverem apenas no último diretório, você poderá usar essas informações para descobrir qual é copiar os resultados e remover os outros diretórios.
fonte
Tem
sort
o-n
-r
e-k
opções? Em caso afirmativo, use:Para testar o resultado, use:
O resultado deve ser:
Para salvar o diretório com o maior índice e remover o restante deles (assumindo
LastDirectory
que não existe), use:O
sort -nr -k1.4
comando usa a-k
opção para classificar os nomes de diretório usando o quarto caractere para o último caractere, ignorando os três primeiros caracteres. A-n
opção é classificada numericamente e a-r
opção inverte a ordem para que o maior número seja o primeiro.Uma nota sobre robustez, isto é, lidar com condições inesperadas. A solução assume que todos os nomes correspondem ao padrão onde há três caracteres, "
Dir
", seguidos por um número, e issoLastDirectory
não existe. Em geral, ols
comando é problemático porque lista os nomes de uma maneira fácil de ler; mas, por exemplo, se um nome de arquivo tiver um espaço incorporado (caractere em branco), o nome quebraria essa solução de maneiras imprevisíveis.fonte
Se você está bem com a classificação dos diretórios por data (parece que o diretório com o maior índice também é o mais recentemente criado), você pode fazer isso:
que lista todos, exceto o diretório mais recente. Para excluí-los:
O argumento chave aqui é o
-t
que classifica por data.fonte