Mover arquivos em diretórios aninhados para a pasta de destino, mas manter o nome de base e descartar a estrutura de pastas?

3
find $(MY_DIR)/source -type f -name "*.wav3" -print0 | \
xargs -0 -P $(NPROC) -n1 -I {} \
mv {} $(MY_DIR)/sound/{}.wav

Do acima eu estou tentando encontrar todos os arquivos .wav3, mova-os para a pasta de som, no entanto eu não estou muito certo como cortar o arquivo de saída para apenas manter o seu nome de base:

$(MY_DIR)/source/deeply/nested/file/song1.wav3

$(MY_DIR)/source/deeply/nested/file/song2.mp3.wav3

será movido para:

$(MY_DIR)/sound/song1.wav

$(MY_DIR)/sound/song2.wav

Como posso ajustar meu script?

    
por sp334 02.07.2016 / 13:19

1 resposta

2

Em vez de mexer com find + xargs + mv , basta alternar para zsh e fazer

autoload -U zmv
zmv -n '$(MY_DIR)/source/**/(*).wav3' '$(MY_DIR)/source/${1%%.*}.wav'

Como funciona:

  • primeiro, carregamos zmv via autoload
  • O parâmetro -n é para evitar a execução, apenas veja o que ele fará e, se estiver satisfeito com a saída, remova essa opção
  • double star ** corresponde a todos os diretórios aninhados
  • (*) corresponde a qualquer coisa e armazena o resultado em $1 variable
  • ${1%%.*} tira o primeiro ponto todos os caracteres subseqüentes
  • e finalmente adicione .wav extension
por 02.07.2016 / 14:22

Tags