Linha de comando da lista de arquivos (ocultos e subpastas)

3

Eu preciso obter uma lista de texto de todos os arquivos (ocultos e visíveis) em um disco rígido, incluindo subpastas. Idealmente, a lista teria o nome do arquivo, caminho, tamanho e data de criação (ou última modificação), se possível. Alguém pode me dizer qual comando eu preciso? Além disso, é possível ter isso criado como um arquivo .csv ou algo similar para uso no Excel?

Eu não sou super proficiente com o Ubuntu, então uma explicação de cada item de comando também seria muito apreciada.

    
por impact_it 25.04.2018 / 22:35

2 respostas

7

Com bash

Supondo que o disco em questão esteja montado em /media/disk1 :

$ shopt -s globstar dotglob
$ stat -c '"%n",%s,%y' /media/disk1/**/* >disk1.csv

shopt -s globstar dotglob ativa o recurso de globalização recursiva do bash (permite o uso de '**', consulte link ). Ele também ativa a correspondência de arquivos que começam com . , também conhecidos como arquivos ocultos.

stat é o programa usado para obter metadados do arquivo. Basicamente, este programa será executado para cada arquivo no disco.

-c '"%n",%s,%y' especifica o formato de saída para o comando stat . %n é o nome do arquivo, entre aspas duplas, %s é o tamanho do arquivo, %y é a hora da última modificação. (veja stat --help )

/media/disk1/**/* diz ao bash para entregar todos os nomes de arquivos encontrados recursivamente sob esse caminho para o pogram (stat), para arquivos normais e ocultos, já que o dotglob está ativado.

>disk1.csv redireciona a saída para um arquivo chamado disk1.csv .

A saída em disk1.csv será semelhante a esta para minha casa, por exemplo:

$ stat -c '"%n",%s,%y' /home/seb/**/*
"/home/seb/111",82,2018-03-26 18:38:04.048099912 +0200
"/home/seb/app",4096,2017-07-13 23:39:06.509862769 +0200
"/home/seb/Applications",4096,2018-03-14 20:20:48.552005660 +0100
"/home/seb/Applications/arduino-1.8.2",4096,2017-05-29 20:45:01.184017517 +0200
"/home/seb/Applications/arduino-1.8.2/arduino",946,2017-03-22 13:32:41.000000000 +0100
[...]

Eu testei para importar o csv resultante para o libreoffice calc e funcionou bem, também com nomes de arquivo engraçados com quebras de linha neles. Ele provavelmente vai sufocar nos nomes de arquivos com aspas duplas neles.

ARG_MAX

O comando acima falhará se o número total de arquivos for muito alto ou o número total de caracteres em todos os nomes de arquivos for muito alto. Para pequenas unidades (pen drives USB, etc.), isso deve ser o suficiente, mas se você estiver indexando um disco grande com milhões de arquivos, provavelmente atingirá esse limite.

Você pode executar o seguinte, ele produzirá a mesma saída (e consumirá menos memória):

find /media/disk1 -type f -print0 | xargs -0 stat -c '"%n",%s,%y' >disk1.csv

Para o padrão "find .. -print0 | xargs -0 .." você encontrará muitas respostas aqui, e. g. Diferença entre "xargs" e substituição de comando?

    
por Sebastian Stark 26.04.2018 / 00:46
3

Com o GNU , ache:

find /path/to -type f -printf '%f,%h/,%s,%TD %Tr\n' > all-files.csv
  • O nome do arquivo %f return com todos os diretórios principais removidos (somente o último elemento).
  • O %h retorna os principais diretórios do nome do arquivo (todos, exceto o último elemento).
  • O %s retorna o tamanho do arquivo em bytes.
  • O %Tk̲ retorna a hora da última modificação do arquivo no formato especificado por k̲; então

    • A hora da última modificação do arquivo %TD retorna no formato mm/dd/yy
    • O %Tr retorna a hora da última modificação dos arquivos no formato time, 12-hour (hh:mm:ss [AP]M)
  • O / , , e \n imprime o caractere de barra, vírgula e um \n ewline, respectivamente.

mais detalhes, leia em man find e -printf format seção.

    
por devWeek 26.04.2018 / 07:24