我有一个包含多个文件夹的文件夹,每个文件夹都有一堆mp3文件。
此文件的名称如" 23 - Lecture-1.mp3"
我试图标记mp3,以便按正确的顺序播放音频文件。
所以我需要在每个上提取曲目编号(上例中为23),并将其与所有其他文件进行比较并保持最高。
我的问题是,在通过文件的循环结束后,最高变量不会持久存在,最高值始终为0(我为其初始化的值。)
所以问题是:
如何让bash在循环外保留该值?
find /media/mdisk/Audio -path "*AIFR*" -type d -print0 | while IFS= read -r -d '' folder; do
cd "$folder";
highest=0
find . -name "*.mp3" -print0 | while IFS= read -r -d '' file; do
basename=`basename "$file"`
current=$((`echo $basename | cut -d "-" -f1 | sed 's/^0*//'`+ 0));
highest=$(($highest+0))
echo "Current is $current"
if [ "$current" -gt "$highest" ]; then
highest=$current;
echo $highest # <--------------- right value here
fi
done
echo "Highest is $highest"; # <----------- value is gone
echo "";
done
答案 0 :(得分:2)
这是因为你的管道从find
到while
。管道在子壳中创建子壳和变量赋值不会自动移动到父壳。相反,也许可以将find
的结果扔到一个变量上,让你的While
循环咀嚼掉。
答案 1 :(得分:0)
感谢@kojiro的链接,这是我的解决方案,供将来参考。
find /media/mdisk/Audio -path "*AIFR*" -type d -print0 | while IFS= read -r -d '' folder; do
cd "$folder";
highest=0
files=`find . -name "*.mp3" -print0`
while IFS= read -r -d '' file; do
basename=`basename "$file"`
current=$((`echo $basename | cut -d "-" -f1 | sed 's/^0*//'`+ 0));
highest=$(($highest+0))
echo "Current is $current"
if [ "$current" -gt "$highest" ]; then
highest=$current;
echo $highest
fi
done < <(find . -name "*.mp3" -print0)
echo "Highest is $highest"; # <--------------- good value now
echo "";
done