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?