Localiza arquivos no disco que correspondem a uma lista de arquivos realmente longa

1

Eu tenho uma lista de dezenas de milhares de nomes de arquivos. Eu quero encontrar quais desses arquivos realmente existem no disco (em um diretório específico). Não sei como começar. Eu poderia tentar com o Python ou o bash.

A lista de nomes de arquivos é um arquivo ascii com um nome de arquivo por linha e nenhum outro conteúdo.

    
por MountainX 08.02.2014 / 04:01

4 respostas

4

Vamos supor que seus nomes de arquivos sejam caminhos absolutos e que todos os arquivos estejam em um diretório, e você deseje encontrar apenas arquivos (não diretórios, arquivos especiais, etc.) e não possui espaços ou caracteres especiais em seu arquivo. nomes.

sort < yourlist >yourlist_sorted 
find <absolute path to dir> -type f |sort |comm -1 -3 - yourlist_sorted

Imprimirá linhas do seu arquivo que não podem ser encontradas com o resultado, por exemplo. que não estão no seu disco.

A escolha de quais arquivos são exibidos é controlada pelo comando comm e pelas duas primeiras opções. o comando comm , vê dois arquivos stdin (lista de localização) e sua lista o controle de opções que o conjunto é filtrado (removido). -1 filtra linhas apenas no arquivo 1, -2 somente no arquivo 2, -3 linhas no arquivo 1 e 2

Então,

  • -2 -3 Imprime arquivos que são encontrados no disco e não na sua lista
  • -1 -2 Imprime arquivos encontrados no disco e na sua lista. < == O que você quer
  • -1 -3 Imprime arquivos que estão apenas na sua lista e não no disco.
por 08.02.2014 / 04:58
2

Se list.txt contiver uma lista de arquivos nomes (não caminhos) e supondo que nenhum dos nomes de arquivo contenha caracteres de nova linha:

find . | awk -F/ 'NR==FNR{a[$0];next}; $NF in a' list.txt -
    
por 08.02.2014 / 10:25
1

Eu não entendi sua pergunta. Para saber se os arquivos da lista realmente existem, você precisará passar o nome deles para encontrar o comando. Uma solução ingênua seria fazer uma iteração na lista e passar cada item para o comando find:

IFS=''
while read i ; do
   find "$i" 2>/dev/null
   RC=$?
   if [ $RC -eq 0 ] ; then
        echo "file $i exists" >> /tmp/exists.txt
   fi
done < list.txt

Isso colocará todos os arquivos que existem no arquivo /tmp/exists.txt .

    
por 08.02.2014 / 04:37
1

Aqui está uma outra maneira, localize todos os arquivos e passe o resultado através de grep usando a opção -f para fazer com que ele leia os padrões de um arquivo, -w para fazer coincidir se o padrão for uma palavra inteira "e -F , por isso não trata os padrões como expressões regulares:

find /path/to/dir -type -f | grep -wFf list.txt

Isso também pressupõe que você não tenha novas linhas em seus nomes de arquivos.

    
por 08.02.2014 / 16:08

Tags