如何在Bash脚本中用其父目录的名称批量替换部分文件名?

如何在Bash脚本中用其父目录的名称批量替换部分文件名?,bash,shell,Bash,Shell,我所有的文件名都遵循以下模式: abc_001.jpg def_002.jpg ghi_003.jpg 我想用这些文件所在目录的名称替换数字和下划线(不一定是字母)之前的字符。假设这个目录叫做“图片”。因此,它将是: Pictures_001.jpg Pictures_002.jpg Pictures_003.jpg 通常,这个网站的工作方式是,你展示你做了什么,你有什么问题,我们给你一个如何解决它的提示。你没有向我们展示任何东西,所以我会给你一个起点,但不是完整的解决方案 您需要知道要更换

我所有的文件名都遵循以下模式:

abc_001.jpg
def_002.jpg
ghi_003.jpg
我想用这些文件所在目录的名称替换数字和下划线(不一定是字母)之前的字符。假设这个目录叫做“图片”。因此,它将是:

Pictures_001.jpg
Pictures_002.jpg
Pictures_003.jpg

通常,这个网站的工作方式是,你展示你做了什么,你有什么问题,我们给你一个如何解决它的提示。你没有向我们展示任何东西,所以我会给你一个起点,但不是完整的解决方案

您需要知道要更换什么:您已经给出了示例
abc_001
def_002
,您确定“要更换”零件的长度始终等于3吗?在这种情况下,您可以使用
cut
basic命令删除此项。在其他方式中,您可以使用
字符的位置,也可以使用
grep-o
处理此问题,如下面的简单示例中所示:

ls -ltra | grep -o "_[0-9][0-9][0-9].jpg"

就当前目录而言,您可以使用环境变量
$PWD
(如果
Pictures
是最深的子目录,您可以使用
cut
,使用
'/'
作为分隔符并取最后找到的条目)来找到它。

您可以使用
PWD
查看当前目录,但也可以使用
echo“${PWD}”

使用
${x#something}
可以从变量开头删除
something
<代码>某些东西可以有通配符,在这种情况下,
#
删除最小的,而
##
删除最大的匹配。
首先尝试下一个命令以理解上述解释:

echo "The last part of the current directory `pwd` is ${PWD##*/}"
同样的结构也可以用于剪切文件名,所以您可以这样做

for f in *_*.jpg; do
   mv "$f" "${PWD##*/}_${f#*_}"
done

不,它并不总是等于3。使用“”也不是一个好选项,因为文件名中可能有其他“”。我想要的是使用文件名末尾的三个数字和下划线,并用我想要的替换前面的数字。@Thomas:我在答案中添加了一个简单的grep示例。是的,我明白了。但是它不能帮助我替换之前的内容。替换内容是使用
$PWD
变量找到的,正如我提到的。是的,那部分对我来说不是问题。但是,我使用什么命令将$PWD的值替换为我要替换的值呢。我已经看过mmv、rename和sed,但我对它们的工作原理不太了解。我投了反对票,因为没有进行任何尝试,而且示例不能代表您的文件配置。请看一看Perl的独立
rename
命令。@Cyrus我可以在s/pattern/replacement/with rename中使用变量代替替换吗?可以,请参阅:我建议用多个有代表性的示例(带路径)更新您的问题。