如何阻止此脚本将重命名的文件移出源文件夹?

时间:2014-05-29 04:06:07

标签: bash

该脚本可以重命名文件,但会将重命名的文件移出各自的文件夹。

我希望它不会移动它们但只重命名它们,经过几天的尝试后我失败了。我知道这段代码很乱,而且里面有不需要的代码,但它几乎可以工作。

此外,重命名的文件未获得.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别名从终端运行此脚本。

1 个答案:

答案 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会没问题。)


tripleeecomment稍加提示下,可以将代码的egrep | sed部分简化为:

    newname="${i%/*}"/$(sed -n -e '/Official DR value:/{s///p;q;}' "$i");

BSD sed需要第二个分号,但GNU sed不需要。