Como obter a última pasta (ordenada alfabeticamente em ordem descendente e correspondente a um padrão) usando ls / find / etc?

2

Então eu tenho essa estrutura de sistema de arquivos

/my.parent
  -> my.folder1
     -> my-file1.txt
  -> my.folder2
     -> my-file2.txt
  -> another-folder-here
     -> another-file.txt

Usando esta série de comandos:

ls -r /my.parent/my.folder* | head -n 1 | rev | cut -c 2- | rev

Ele retorna o caminho completo para my.folder2, que é o que eu quero. Meu problema é que, se houver apenas uma pasta correspondente ao padrão (por exemplo, delete / move my.folder1), recebo uma listagem do conteúdo de my.folder2 em vez de obter o caminho completo.

Alguma idéia de como corrigi-lo para funcionar em todos os casos? Muito obrigado.

    
por mrjayviper 23.07.2016 / 17:14

3 respostas

3

Para obter ls para exibir o nome da pasta, em vez de listar seu conteúdo, use seu argumento -d , como:

ls -ld ~
    
por 23.07.2016 / 17:29
2

Sem ls , no bash, ou algum outro shell que tenha arrays (isso deve funcionar mesmo com nomes que contenham caracteres engraçados):

$ names=( my.parent/my.folder* ); echo ${names[-1]}
my.parent/my.folder2

Sem matrizes (não tão robustas contra caracteres engraçados, mas salva um fork do ls ):

$ printf "%s\n" my.parent/my.folder*  | tail -1
my.parent/my.folder2
    
por 23.07.2016 / 17:48
0

Não analise a saída de ls .

O shell expande /my.parent/my.folder* para a lista de subdiretórios de /my.parent cujo nome começa com my.folder em ordem alfabética. Chamar ls não faz nada útil.

Para escolher o último elemento da lista, se o seu shell tiver arrays, coloque a lista em um array e escolha o último elemento.

directories=(/my.parent/my.folder*)
last_directory="${directories[${#directories}-1]}"

Se o seu shell não tem arrays, você pode fazer isso através dos parâmetros posicionais.

set -- /my.parent/my.folder*
eval "last_directory=\${$#}"

Isto sobrescreve os parâmetros posicionais atuais. Para evitar isso, use uma função.

set_to_last () {
  eval "$1=\${$#}"
}
set_to_last last_directory /my.parent/my.folder*

Observe que todo o código desta resposta pressupõe que haja pelo menos uma correspondência.

    
por 25.07.2016 / 00:32

Tags