Tenho uma estrutura de diretório como esta:
dir1/
732842342.mp4
screenshot1.png
dir2/
324324234.mp4
screenshot2.png
dir3/
121321321.mp4
screenshot3.png
O que estou tentando fazer é gerar um arquivo CSV que tenha um formato como este:
dir_name, video_name, screenshot_file
dir1, 732842342.mp4, screenshot1.png
dir2, 324324234.mp4, screenshot2.png
dir3, 121321321.mp4, screenshot3.png
Posso obter cada nome de diretório simplesmente executandols
$ ls
dir1
dir2
dir3
Não sei como fazer a próxima parte, pois exigiria entrar em cada diretório (por exemplo, cd dir1/ && ls
) e então obter o nome dos arquivos .mp4
e .png
. No entanto, isso é separado do primeiro comando, então não "retém" o nome do diretório ( dir1
neste caso) na saída, pois são usados 2 comandos separados.
O ideal seria escrever um script bash reutilizável para isso, mas não tinha certeza da sintaxe. Alguém pode ajudar?
Usar
find
esed
Primeiro crie o arquivo de saída e a linha de cabeçalho
echo "dir_name, video_name, screenshot_file" > myfile.csv
find dir* -print | sed 's!/!, !g'| sed 's!^.,!!' >> myfile.csv
O
find
comando imprime o conteúdo dos diretórios que começam com 'dir'.Existem outras possibilidades para
find
lidar com nomes de diretório:Para processar tudo dentro e sob o diretório atual
find . -type f -print | sed 's!/!, !g'| sed 's!^.,!!' >> myfile.csv
Para processar tudo dentro e sob um diretório nomeado
find /path/to/mydata -type f -print | sed 's!/!, !g'| sed 's!^.,!!' >> myfile.csv
Para pesquisar alguns diretórios nomeados
find dir1 mydata nextdir anotherdir -type f -print | sed 's!/!, !g'| sed 's!^.,!!' >> myfile.csv
até o limite de comprimento da linha de comando.
Adicionei
-type f
(pesquisar por arquivos comuns) para que os diretórios não apareçam na saída.O primeiro
sed
substitui uma barra ('/') por uma vírgula e um espaço. O 'g' garante que isso aconteça para cada correspondência.O segundo
sed
corresponde ao ponto e à vírgula no início de cada linha e não os substitui por nada.Não há proteção contra nenhuma das dificuldades mencionadas nos comentários - como vírgulas em nomes de arquivos ou números diferentes de arquivos por diretório.
Se todos os diretórios contiverem apenas esses 2 arquivos e o vídeo sempre for classificado antes da captura de tela, como no seu exemplo, você pode fazer:
Caso contrário, no zsh, você pode fazer:
Ignorando os diretórios que não têm exatamente um
mp4
e umpng
arquivo. Como bônus, os diretórios são classificados numericamente usando on
qualificador glob para que, por exemplo,dir10
venha depois dedir9
and não entredir1
anddir2
como aconteceria na ordem lexical padrão.Observe como usamos
/
como separadorf
de campos
e NUL como separadorr
de registros
no formato de entrada CSV-lite, pois esses são os únicos dois caracteres que não podem ocorrer em um nome de arquivo (,
e retorno de carro/nova linha, os padrões para CSV,"
são tão válidos quanto qualquer outro caractere em um nome de arquivo;mlr
lidaria com esses caracteres corretamente usando aspas quando necessário e escape"
dentro delas, como""
nos formatos CSV mais comumente usados, como o especificado pelo RFC4180 ).