mkdir baseado na entrada de outros diretórios

4

Eu tenho um diretório cheio de álbuns que eu copiei para o formato FLAC. As pastas são chamadas de "Artist - Album [flac]" Eu preciso criar diretórios correspondentes chamados "Artist - Album [mp3]" mas apenas para certas pastas ...

Então "ls | grep Pantera" me fornece a lista de diretórios com os quais quero trabalhar ...

Como posso fazer isso via linha de comando?

    
por LVLAaron 13.06.2011 / 17:19

3 respostas

3

Você pode usar xargs para usar a saída de um comando como argumentos para executar outro; mas usando a saída de ls para isso é uma loucura problemática por causa de espaços e citando questões. Para realizar o que você está sugerindo se houver algum espaço nos nomes produzidos, você teria que fazer algo assim:

ls | grep Pantera | sed -e 's/\[flac\]/[mp3]/' | xargs -n1 -i{} mkdir "{}"

No entanto, a ferramenta muito melhor para isso seria usar os comandos find e -exec . A menos que alguém saiba como usar as funções de string do bash em uma string literal em vez de uma variável ou conjunto e usar uma variável em um comando, você precisará de sintaxe do ssapkota para iniciar um subshell.

Ao usar find, considere também opções como -type d para retornar somente correspondências de diretório (ou -type f para arquivos). Você poderia remover o -maxdepth 1 se quisesse fazer uma descoberta recursiva. Também é possível que a correspondência de padrões possa ser refinada para o seu cenário.

    
por 13.06.2011 / 17:27
2

Encontrar é a melhor ferramenta para isso. Mas find apenas permite um único comando e não suporta encadeamento.

Aqui está a solução que funciona ao bifurcar um subshell para cada nome de diretório correspondente.

find -maxdepth 1 -iname "*Pantera*" -exec  \
    bash -c ' name="{}" && mkdir "${name/flac/mp3}" ' \;
    
por 13.06.2011 / 18:14
1

Todos os arquivos estão no mesmo diretório? Então você pode usar um simples loop mais construções de manipulação de string de shell.

for flac_dir in *Pantera*'[flac]'/; do
  flac_dir=${flac_dir%/}
  mp3_dir="${x%\[flac\]}[mp3]"
  mkdir "$mp3_dir"
done

Se você quiser atuar recursivamente em subdiretórios, sob zsh, ou sob bash ≥4, você pode usar for flac_dir in **/*Pantera*'[flac]'/ . Com o bash, você precisa executar shopt -s globstar primeiro.

    
por 13.06.2011 / 23:39