Aplique um comando a todos os arquivos em um diretório, um diretório por vez

2

Quero aplicar informações de reprodução repetida a todos os arquivos MP3 da minha coleção de músicas. Para fazer isso, estou usando uma ferramenta chamada mp3gain (no Linux).

Para aplicar o ganho do álbum corretamente, preciso executar o comando mp3gain por diretório. Em outras palavras, preciso encontrar um diretório, executar o mp3gain em todos os arquivos desse diretório e, em seguida, repetir para cada outro diretório. Até agora, eu inventei isso:

 find . -type d -exec mp3gain {}/*.mp3 \;

A saída é assim (mostrando apenas alguns dos muitos diretórios):

[...]
./dev2/Physicist/*.mp3
Can't open ./dev2/Physicist/*.mp3 for reading
./Real Things/*.mp3
Can't open ./Real Things/*.mp3 for reading

Parece-me que o ' * ' está sendo escapado, então, em vez de procurar por todos os arquivos terminados em '.mp3', ele está procurando por um arquivo chamado ' * .mp3'.

Qual comando devo usar?

    
por NickG 29.11.2009 / 20:17

3 respostas

7

Parece que não está circulando corretamente. Que tal algo como isto:

#!/bin/bash
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
for dir in $(find . -type d)
do
        mp3gain $dir/*
done
IFS=$OLDIFS

como um único comando:

OLDIFS=$IFS;IFS=$(echo -en "\n\b");for dir in $(find . -type d);do mp3gain $dir/*;done;IFS=$OLDIFS
    
por 29.11.2009 / 20:55
1

Pode não parecer legal, mas este comando irá encontrar todos os diretórios que contêm arquivos mp3 gravá-los em um arquivo temporário e, em seguida, passar por esse arquivo temp listando o conteúdo de cada diretório. Se você está feliz com a saída, você pode ir em frente e ligar o seu comando mp3gain no lugar do ls.

Definir a variável IFS como um caractere de nova linha é importante para que você possa trabalhar com arquivos e diretórios que contenham espaços.

A razão pela qual escolhi listar diretórios contendo mp3s primeiro é no caso de o mp3gain gerar um erro ao encontrar conjuntos vazios de arquivos. Desta forma, nunca encontra tal situação.

IFS=$'\n'; for i in 'find -type f -iname *.mp3'; do dirname $i ; done | sort | uniq > ~/mp3directories.txt && for i in 'cat ~/mp3directories.txt'; do ls -1 $i/*.mp3 ; echo ; done
    
por 29.11.2009 / 21:45
-1

Você pode usar o Rebol, ele funciona no Unix e no Windows

Como aplicar uma função a todos os arquivos em um diretório recursivamente

link

    
por 29.11.2009 / 20:43

Tags