该脚本可以重命名文件,但会将重命名的文件移出各自的文件夹。
我希望它不会移动它们但只重命名它们,经过几天的尝试后我失败了。我知道这段代码很乱,而且里面有不需要的代码,但它几乎可以工作。
此外,重命名的文件未获得.txt
的扩展名,但这对我来说并不是一个问题。我只是想看到从文件内部取出的“动态范围值”作为文件名,所以我不必打开每个文件(价值几千张专辑)来查看DR是什么。这是代码:
#!/bin/bash
cd /media/Storage/MusicWorks/Processing
find . -name 'dr14.txt' | while IFS=$'\n' read -r i
do mv -n "$i" `egrep -m1 -e 'Official DR value:' "$i" | sed -e 's/Official DR value://'`;
echo "Done"
done
我使用bash别名从终端运行此脚本。
答案 0 :(得分:0)
我对您脚本的egrep | sed
部分有所保留,但如果它们适合您,那么就这样吧。您需要保留文件的路径名,例如:
find . -name 'dr14.txt' |
while IFS=$'\n' read -r i
do
newname="${i%/*}"/$(egrep -m1 -e 'Official DR value:' "$i" | sed -e 's/Official DR value://');
mv -n "$i" "$newname"
echo "Done $i ($newname)"
done
${i%/*}
表示法会删除$i
中从最后一个斜杠到名称末尾的所有内容。由于find
中的所有名称都以./
开头,因此这足够安全;它在/
和/unix
这样的绝对名称上效果不佳(输出将为空字符串,但/usr/bin/sh
会没问题。)
在tripleee的comment稍加提示下,可以将代码的egrep | sed
部分简化为:
newname="${i%/*}"/$(sed -n -e '/Official DR value:/{s///p;q;}' "$i");
BSD sed
需要第二个分号,但GNU sed
不需要。