Filtre os diretórios da lista de arquivos e diretórios

1

Eu tenho um arquivo contendo nomes de caminho completo de arquivos e diretórios.

A partir desta lista, eu gostaria de filtrar todos os nomes de caminho que referenciam diretórios, de modo que fiquei com uma lista contendo apenas os caminhos de arquivo.

Alguém pode pensar em uma solução elegante?

    
por ARF 14.01.2018 / 23:06

2 respostas

3
while IFS= read -r file; do
  [ -d "$file" ] || printf '%s\n' "$file"
done <input_file

Imprimiria os arquivos que não estão determinados como sendo do tipo diretório (ou link simbólico para o diretório). Ele deixaria todos os outros tipos de arquivos (regular, symlink (exceto para diretórios), sockets, pipes ...) e aqueles para os quais o tipo não pode ser determinado (por exemplo, porque eles não existem ou estão em diretórios que você don não tem permissão de pesquisa para).

Algumas variações dependendo do que você quis dizer por arquivo e diretório ( diretório é um dos muitos tipos de arquivos no Unix):

  • o arquivo existe (depois da resolução do symlink) e não é do tipo diretório :

    [ -e "$file" ] && [ ! -d "$file" ] && printf '%s\n' "$file"
    
  • o arquivo existe e é um arquivo regular (após a resolução do link simbólico):

    [ -f "$file" ] && printf '%s\n' "$file"
    
  • arquivo existe e é um arquivo regular antes da resolução do link simbólico (exclui links simbólicos):

    [ -f "$file" ] && [ ! -L "$file" ] && printf '%s\n' "$file"
    
  • etc.

por 14.01.2018 / 23:15
0

Supondo que file contenha um caminho de arquivo por linha, com zsh :

printf '%s\n' ${(f)^"$(<file)"}(N^/)

imprime aqueles que existem (que podemos dizer que existem) e não estão determinados a serem do tipo diretório (altere / para -/ para também descartar links simbólicos para diretórios). / p>

Como você mencionou xargs , com a implementação GNU (para -d e -r ), e assumindo que nenhum dos caminhos de arquivo inicie com - ou que sejam find predicados (como ! ) poderia fazer:

xargs -rd '\n' sh -xc 'exec find "$@" -prune ! -type d' sh < file

Substitua -type por -xtype (assumindo o GNU find ) para também excluir links simbólicos para os diretórios.

    
por 15.01.2018 / 00:20