Esta é uma implementação muito básica do comando global
descrito para bash
:
global() {
shopt -s globstar
origdir="$PWD"
for i in **/; do
cd "$i"
echo -n "${PWD}: "
eval "$@"
echo
cd "$origdir"
done
}
-
shopt -s globstar
ativa a globalização recursiva com**
(acho que você precisará da versão bash > = 4) -
**/
encontra todos os diretórios abaixo do diretório de trabalho atual, portanto,$i
faz um loop sobre esses - Eu incluí um
echo
para que você possa ver em que dir o loop é atualmente -
eval "$@"
avalia todos os argumentos da função -
cd $origdir
retorna ao diretório original. (No começo eu tinha uma abordagem mais elegante do IMHO compushd
/popd
, mas acho que cd de volta para$origdir
é mais à prova de balas caso o comando"$@"
mude o diretório (o que obviamente é um má ideia!)
Esse comando global
aceita comandos com argumentos como global touch foo
. Se você quiser usar uma sintaxe shell mais avançada, como redirecionamentos ou variáveis, você precisa colocar o comando entre aspas simples '...'
. Mas se o seu desejo é executar o seu script normalize_mp3.sh
em todos os diretórios, o uso é tão simples como
global normalize_mp3.sh
Esteja ciente de que o início do primeiro comando pode precisar de algum tempo para reunir todos os subdiretórios se houver muitos deles.
E, claro, por favor teste com um backup atualizado dos seus arquivos!
Aqui está como funciona (eu só posso testar com o Linux, mas eu assumo que o bash está trabalhando no OSX da mesma forma):
$ echo $BASH_VERSION
4.1.5(1)-release
$ cd /var
$ tree -d | head
.
├── backups
├── cache
│ ├── apt
│ │ ├── apt-file
│ │ └── archives
│ │ └── partial
│ ├── cups
│ │ └── rss
│ ├── debconf
$ global 'echo -n This command is executed in $PWD at $(date); sleep 1'
/var/backups: This command is executed in /var/backups at Mo 1. Jul 12:11:00 CEST 2013
/var/cache: This command is executed in /var/cache at Mo 1. Jul 12:11:01 CEST 2013
/var/cache/apt: This command is executed in /var/cache/apt at Mo 1. Jul 12:11:02 CEST 2013
/var/cache/apt/apt-file: This command is executed in /var/cache/apt/apt-file at Mo 1. Jul 12:11:03 CEST 2013
/var/cache/apt/archives: This command is executed in /var/cache/apt/archives at Mo 1. Jul 12:11:04 CEST 2013
/var/cache/apt/archives/partial: This command is executed in /var/cache/apt/archives/partial at Mo 1. Jul 12:11:05 CEST 2013
/var/cache/cups: This command is executed in /var/cache/cups at Mo 1. Jul 12:11:07 CEST 2013
/var/cache/cups/rss: This command is executed in /var/cache/cups/rss at Mo 1. Jul 12:11:08 CEST 2013
/var/cache/debconf: This command is executed in /var/cache/debconf at Mo 1. Jul 12:11:09 CEST 2013
...