如何使用 Bash 在所有子目录中执行命令

Lui*_*ano 2 unix bash command-line macos

我有一个由以下组成的目录结构:

iTunes/Music/${author}/${album}/${song.mp3}
Run Code Online (Sandbox Code Playgroud)

我实现了一个脚本,使用 lame 将我的 mp3 比特率剥离到 128 kbps(它同时适用于单个文件)。

我的“normalize_mp3.sh”如下所示:

#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in *.mp3
do
  lame --cbr $f __out.mp3
  mv __out.mp3 $f
done
IFS=$SAVEIFS
Run Code Online (Sandbox Code Playgroud)

如果我一个文件夹一个文件夹并执行这个命令,这很好用,但我想要一个“全局”命令,比如在 4DOS 中,所以我可以运行:

$ cd iTunes/Music
$ global normalize_mp3.sh
Run Code Online (Sandbox Code Playgroud)

并且该global命令将遍历所有子目录并执行normalize_mp3.sh删除所有子文件夹中的所有 mp3。

有谁知道是否有与 4DOSglobal命令等效的 Unix ?我试着玩,find -exec但我只是头疼。

Lri*_*Lri 5

其他选项:

find ~/Music -name \*.mp3 | while IFS= read -r f; do
  lame --cbr "$f" "$f"_temp
  mv "$f"_temp "$f"
done
Run Code Online (Sandbox Code Playgroud)
mdfind 'kMDItemAudioBitRate>128000' -onlyin ~/Music |\
parallel lame --cbr {} {}_temp \; mv {}_temp {}
Run Code Online (Sandbox Code Playgroud)
f() { lame --cbr "$1" "$1"_temp; mv "$1"_temp "$1"; }
export -f f
mdfind 'kMDItemAudioBitRate>128000' -onlyin ~/Music | parallel f
Run Code Online (Sandbox Code Playgroud)
shopt -s globstar # bash 4.0 or later
for f in ~/Music/**/*.mp3; do lame --cbr "$f" "$f"_temp; mv "$f"_temp "$f"; done
Run Code Online (Sandbox Code Playgroud)