Prefira todos os arquivos .jpg, .mp3 e .mts em subdiretórios com seus respectivos nomes de diretórios pai

1

Tenho décadas de fotos e vídeos de família organizados e rotulados em uma árvore de diretórios contendo milhares de diretórios. Os caminhos dos arquivos, em geral, são todos semelhantes:

/ my_giant_pictures_dir / year / month_day_ "descrição do evento" / filename

um exemplo poderia ser:

/ my_giant_pictures_dir / 2016 / 07_27_Roadtrip para a Antártida / IMG_00001.jpg

observe que o "evento" ou os diretórios mais profundos podem conter arquivos .jpg, .mp4 e .mts.

Meu problema com essa convenção é que acabo tendo muitos diretórios contendo mídia mais profundos que, por serem organizados primeiro por data, contêm apenas um ou alguns arquivos. (Dias em que apenas uma foto foi tirada, por exemplo). Isso faz com que todas as fotos tiradas durante um período de três meses, por exemplo, sejam tediosas.

Eu gostaria de reestruturar toda essa mídia, mantendo tudo em ordem cronológica, mas eliminando todos os subdiretórios intermediários após o ano. Eu gostaria de fazer isso prefixando todos os nomes de arquivos de mídia com o nome "month_day_event" do diretório pai, por exemplo:

em vez de:

/ Pictures / 2016 / 07_27_Roadtrip para a Antártida / IMG_00001.jpg

... Eu preferiria ter:

/ Pictures / 2016 / 07_27_Roadtrip para Antarctica_IMG_00001.jpg

Existe um comando bash que faria isso para todos os arquivos .jpg, .mp4 e .mts em todo o meu diretório de imagens, depois do nome do arquivo, mova-os para fora do diretório pai e para o próximo diretório mais alto, qual em todos os casos é o diretório year?

E talvez ele esteja pedindo muito, mas também pode excluir os subdiretórios que estão contidos nos diretórios do ano? Não me importo de executar vários comandos, se necessário, porque, de qualquer forma, sua resposta estará me poupando incontáveis horas.

Muito obrigado antecipadamente!

    
por Ross Inman 28.07.2016 / 06:59

1 resposta

1

Tente:

find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)' -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

Como funciona

  • find /my_giant_pictures_dir/ -type f -regex '.*\(jpg\|mp4\|mts\)'

    Isso procura todos os arquivos regulares em qualquer lugar, underneach /my_giant_pictures_dir/ cujos nomes terminam com jpg, mp4 ou mts. Cada arquivo, por sua vez, é passado para o -execdir .

  • -execdir bash -c 'mv "$1" "../${PWD##*/}_${1#./}"' Bash {} \;

    Isso move o arquivo para seu diretório pai enquanto o renomeia.

    Mais detalhadamente, -execdir bash -c '...' Bash {} \; altera o diretório de trabalho atual para o diretório em que o arquivo está e executa bash -c '...' com os argumentos Bash e o nome do arquivo {} .

    bash -c '...' executa o comando naspas simples com $0 tendo o valor de Bash e $1 tendo como seu valor o nome do arquivo.

    Dentro das aspas simples, temos mv "$1" "../${PWD##*/}_${1#./}" Isso move o arquivo $ para o diretório pai, ../ com o nome ${PWD##*/}_${1#./} .

por 28.07.2016 / 07:23