正则表达式和shell - 多个递归重命名

时间:2012-03-05 05:31:55

标签: regex shell unix

我有一个包含数百个文件夹的文件夹。这些文件夹包含每个文件夹,称为图像,在此文件夹中,有时会有严格命名的.jpg文件。有时文件夹中还有其他JPG文件,但如果它们不是严格的数字,则需要忽略这些文件。

我想学习如何编写一个脚本,当在给定文件夹中运行时,遍历每个子文件夹并查找此数字文件。然后,如果此类文件尚不存在,则会将“_n”后缀添加到每个后缀的副本

这可以通过unix终端轻松完成吗?

更具体地说,这是我正在处理的结构:

  • 主文件夹
    • 18556
      • 图像
        • 2234.jpg
    • 47772
      • 图像
        • 2234.jpg
        • 2234_n.jpg
        • some_pic.jpg
    • 77377
      • 图像
    • 88723
      • 图像
        • 22.jpg
        • some_pic.jpg

脚本运行后,情况如下:

  • 主文件夹
    • 18556
      • 图像
        • 2234.jpg
        • 2234_n.jpg
    • 47772
      • 图像
        • 2234.jpg
        • 2234_n.jpg
        • some_pic.jpg
    • 77377
      • 图像
    • 88723
      • 图像
        • 22.jpg
        • 22_n.jpg
        • some_pic.jpg

更新:抱歉打字错误,我不小心将2235放入47772。 更新2:关于math.coffee的答案的第二个评论,我目前在(在工作中)的操作系统是MacOS,但我的主要机器在家里运行CentOS和Ubuntu,所以我假设我的情况适用于所有基于unix的系统

2 个答案:

答案 0 :(得分:4)

您可以使用-regex切换到find来匹配/somefolder/images/numeric.jpg

find -type f -regex './[^/]+/images/[0-9]+\.jpg$'

编辑:来自@JonathanLeffler的优化:添加-type f以便查找以便它只查找文件(即与名为'12345.jpg'的目录不匹配)。

./[^/]+/用于第一个文件夹(如果第一个文件夹始终是数字文件夹,则可以将其更改为[0-9]+)。

[0-9]+\.jpg$表示文件名仅为数字的jpg文件。 您可能希望将jpg更改为jpe?g以允许.jpeg,但这取决于您。

然后将这些复制到xxx_n.jpg

for f in $(find -type f -regex './[^/]+/images/[0-9]+\.jpg$')
do
    # replace '.jpg' in $f (filename) with '_n.jpg'
    newf=${f/\.jpg/_n\.jpg}
    # see if this new file exists
    if [ ! -f $newf ];
    then
        # if not exists, copy it.
        cp "$f" "$newf"
    fi
done

答案 1 :(得分:1)

文件夹47772中重命名的逻辑应该是什么?如果我们假设您要将所有包含数字的文件重命名为数字+ _n

使用mmv,您可以将其写成:

mmv "[0-9][0-9]*.jpg" "#1#2#3_n.jpg"

注意:mmv用于移动; mcp用于复制,因此更适合此问题。

维达的问题: 好吧,我检查了手册页,问题是它有点奇怪。 我在想[0-9] *会匹配零个或多个数字。我发现这个假设是错误的。 问题是,我无法告诉我在名称的开头需要两个或更多数字。

所以[0-9] [0-9] *匹配一个以至少两个数字开头的名称(之后它将所有其余的数据带到...现在每个[0-9]都是一个模式,所以我不得不把模式变成:  “#1#2#3_n.jpg”例如1234.jpg我有#1 = 1; #2 = 2,#3 = 34所以

#1#2#3 -> 1234;  _n appends the _n and .jpg the extension

然而,它会使用12some_other_stuff.jpg sot 12some_other_stuff_n.jpg重命名文件。它并不理想,但在这种情况下实现了预期目标。