Conte e mova arquivos por padrão

0

Eu tenho muitos arquivos epub que estou tentando organizar em pastas. Todos os meus arquivos nomeados seguindo o mesmo padrão "Autor - Nome (Ano) .epub". O que eu estou tentando arquivar é contar os arquivos pelos autores e movê-los para a pasta com o nome do autor, se o número de livros for maior que 2 (por exemplo).

Por exemplo, para os seguintes arquivos:

Willis, Connie - [Oxford Time Travel #1] - Doomsday Book (1992).epub
Willis, Connie - [Oxford Time Travel #2] - To Say Nothing of the Dog (1997).epub
Willis, Connie - [Oxford Time Travel #3] - Blackout (2010).epub
Willis, Connie - [Oxford Time Travel #4] - All Clear (2010).epub
Wilson, Robert Charles - Julian Comstock - A Story of 22nd-Century America (2009).epub
Wilson, Robert Charles - [Spin Saga #1] - Spin (2005).epub

Todos os livros de Connie Willis devem ser movidos para a pasta "Willis, Connie", já que a contagem é maior que 2, enquanto os livros de Robert Wilson não serão tocados.

Eu me sinto realmente perdido e não sei por onde começar isso.

    
por Paul Poloskov 28.05.2018 / 14:22

1 resposta

0

Solução de três etapas. cd para um diretório onde os arquivos estão e, em seguida:

  1. Isso moverá cada arquivo para o subdiretório correspondente:

    find . -maxdepth 1 -type f -iname "* -*.epub" \
       -exec bash -c '
           mkdir "${1%% -*}" 2>/dev/null; mv -n -- "$1" "${1%% -*}"/
       ' bash {} \;
    

    "${1%% -*}" é uma parte de "$1" até o primeiro - (espaço + menos). Esperamos que às vezes o subdiretório já exista; mkdir irá falhar, tudo bem.

  2. Isso detectará subdiretórios com dois ou menos arquivos e moverá todo o seu conteúdo (de volta) para o diretório de trabalho atual:

    find . -mindepth 1 -maxdepth 1 -type d \
       -exec sh -c '
          [ $(find "$1" -maxdepth 1 -type f -printf "\n" | wc -l) -le 2 ]
       ' sh {} \; \
       -exec sh -c '
          find "$1" -mindepth 1 -maxdepth 1 -exec mv -n -t ./ -- \{\} +
       ' sh {} \;
    

    Altere o fragmento -le 2 para ajustar o número. Você pode se perguntar por que eu digo a find para imprimir novas linhas em vez de nomes de arquivos (comportamento padrão). Isso ocorre porque wc é uma ferramenta de texto, possíveis novas linhas em nomes de arquivos quebrarão minha lógica. A impressão explícita de exatamente uma nova linha por arquivo corrige esse problema.

  3. Isso removerá os diretórios vazios:

    find . -maxdepth 1 -type d -empty -delete
    

    Ele deve funcionar mesmo sem -empty porque -delete (como rmdir ) excluirá um diretório apenas se estiver vazio. No entanto, nesse caso, gostaria de suprimir as mensagens de erro esperadas dizendo que o diretório fornecido não está vazio. Fazer isso com 2>/dev/null também me impediria de ver mensagens de erro inesperadas. Daí o -empty de qualquer maneira.

Execute estes passo a passo ou crie um script. É aconselhável fazer backup de sua estrutura de diretórios com antecedência (por exemplo, cp -lr my_directory my_directory_backup ) apenas no caso. Algumas opções que usei não são POSIX, mas podem não funcionar para você. Além disso, se você já tiver subdiretórios, minha solução poderá gerenciá-los; ajuste-o às suas necessidades.

    
por 28.05.2018 / 20:48