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

Bash 如何阻止此脚本将重命名的文件移出源文件夹?,bash,Bash,脚本的工作方式与重命名文件一样,但它会将重命名的文件移出各自的文件夹 我希望它不移动它们,而只是重命名它们,经过几天的尝试,我失败了。我知道这段代码乱七八糟,里面有不需要的代码,但它几乎可以工作 此外,重命名后的文件没有扩展名.txt,但这对我来说不是什么问题。我只想看到从文件内部获取的动态范围值作为文件名,这样我就不必打开每个文件,只要打开几千张相册就可以看到DR是什么。代码如下: #!/bin/bash cd /media/Storage/MusicWorks/Processing find

脚本的工作方式与重命名文件一样,但它会将重命名的文件移出各自的文件夹

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

此外,重命名后的文件没有扩展名.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别名从终端运行此脚本。

我对脚本中的egrep部分有所保留,但如果它们适用于您,就这样吧。您需要保留文件的路径名,例如:

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可以

在a中的一点提示下,可以将代码的egrep|sed部分简化为:

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

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

您好,乔纳森,非常感谢您对本脚本的帮助。我真的很感激。您发布的代码工作时没有任何缺陷,并且无需打开文件即可轻松查看相册的动态范围。非常好,再次感谢:干杯一般来说,grep | sed是一个sed脚本,可以更好地重新表述为一个sed脚本。在你的情况下,它也非常简单;sed'/官方DR值:/!Ds//;q'$i@tripleee:或更简单:sed-n'/官方DR值://{s///p;q;}'$i。BSD sed需要第二个分号,GNU sed则不需要。如果文件中有多个匹配项,则会打印多行。大概添加egrep-m1是为了解决这个精确的问题。@tripleee-Yes;额外的修复现在并入我以前的评论中。当你的额外评论到达时,我正在检查-m1做了什么。