Como evitar que 'ls' classifique a saída?

1

Eu tenho uma ordem específica de arquivos que desejo listar se eles existirem; cerca de 40 arquivos. Algum tipo de precedência. Então eu tentei:

ls -1d         /opt/foo/lib.jar /opt/bar/lib.jar

Eu esperava que isso listasse /opt/foo/lib.jar primeiro se ambos existissem. Mas na verdade ele imprime o bar primeiro e o foo depois disso.

Existe alguma maneira de tornar ls listar as entradas na ordem dada em parâmetros?
Ou alguma abordagem alternativa com find ?

    
por Ondra Žižka 31.08.2018 / 00:59

5 respostas

6

Com o GNU ls , você pode tentar a opção -U :

-U: do not sort; list entries in directory order

(embora aqui não estejamos listando o conteúdo dos diretórios, então a parte que importa é não classificar ).

$ ls -1dU /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar

Ligeiramente mais portátil (funciona com GNU e FreeBSD ls , mas não com implementações tradicionais de ls e não é POSIX também), você pode usar ls -1df :

$ ls -1df /opt/foo/lib.jar /opt/bar/lib.jar
/opt/foo/lib.jar
/opt/bar/lib.jar
    
por 31.08.2018 / 02:25
1

Depois de mencionar find , descobri que pode levar mais de um caminho como argumento de caminho. Então é simplesmente:

 find /opt/foo/lib.jar /opt/bar/lib.jar -prune 2> /dev/null
    
por 31.08.2018 / 01:03
1

Você pode criar uma função de wrapper em torno de ls que faz um loop sobre os argumentos (na ordem em que são fornecidos), chamando ls em cada:

myls() {
  for arg do
    ls -d -- "$arg"
  done
}

Com uma referência à resposta de Stéphane em Como usar argumentos como $ 1 $ 2 ... em um loop for? para a sintaxe for arg do .

    
por 31.08.2018 / 03:30
0

Em zsh , para reduzir uma lista de arquivos para os que existem, você pode usar o qualificador (N) glob anexado a cada elemento da lista:

files=(/opt/foo/lib.jar /opt/bar/lib.jar)
that_exist=($^files(N))

(($#that_exist > 0 )) && print -rl -- $that_exist

Note que ao contrário de ls , ele pode dizer se um arquivo existe ou não, mesmo se você não tiver pesquisa acesso ao seu diretório pai (contanto que você ainda tenha acesso de leitura) , como procura por entradas correspondentes no diretório sem tentar acessar o arquivo.

Veja também:

that_exist_after_symlink_resolution=($^files(N-^@))

Que seleciona os arquivos que não são ( ^ ) um link simbólico ( @ ) após a resolução do symlink ( - ). Equivalente ao uso de ls -Ld .

    
por 04.09.2018 / 00:06
0

Se você tem uma lista de nomes de caminhos pelos quais gostaria de passar e testar a existência, presumo que gostaria de fazer algo com os que existem, para os que não existem , ou para ambos os conjuntos de nomes de caminho.

Dado um shell padrão, isso é feito melhor em um loop.

for pathname in /the/first/path /the/second/path /some/other/path
do
    if [ -e "$pathname" ]; then
        printf 'Path "%s" exists\n' "$pathname"
    else
        printf 'Path "%s" does not exist\n' "$pathname"
    fi
done
    
por 04.09.2018 / 11:17

Tags