Para obter ls
para exibir o nome da pasta, em vez de listar seu conteúdo, use seu argumento -d
, como:
ls -ld ~
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.
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
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.