根据文件的一部分重命名文件

根据文件的一部分重命名文件

如何将多个文件的 2009-08-2009-08-13 重命名为 2009-08-$my_var_till_2009-08-13?2009-08-13 部分会根据文件日期而变化,因此我需要一种方法来获取文件名的这一部分。我可以用 basename 吗?

答案1

如果文件名始终采用该日期格式,我认为类似这样的操作会起作用(在脚本中) - 当然,这是假设它们都在同一个目录中并且'$my_var_till'在shell中定义:

#!/bin/bash

cd <name_of_target_directory>

for i in `ls`
do
    yyyy=`echo $i | awk -F- '{print $3}`'
    mm=`echo $i | awk -F- '{print $4}'`
    dd=`echo $i | awk -F- '{print $5}'`

    mv $i "$yyyy-$mm-$my_var_till-$yyyy-$mm-$dd"
done

如果 '$my_var_till' 没有在 shell 中定义,您可以将其作为命令行参数(当然您可能希望使用该参数添加一些错误检查):

#!/bin/bash

my_var_till=$1
<continue on with code from above>

答案2

如果你有这个实用程序rename(我想有几个,我有 perl 版本):

rename -n -e 's/(\d{4}-\d{2})-([\d-]+)/$1'"$your_variable"'$2/' *

-n标志表示rename不会更改任何文件,它只会显示将发生哪些更改。删除它可重命名文件。

答案3

韓國可以帮助:

如果您需要在 Linux 下重命名或移动多个文件,mmv shell 命令将让您的生活变得轻松。mmv 实用程序还可用于复制多个文件、将一个文件的内容附加到其他文件以及创建链接。

答案4

此脚本将重命名任何文件,名称如下

this: 2009-08-2009-08-13
to:   2009-08-${my_var_till}_2009-08-13

例如,如果my_var_till="whatever",并且 filename= "2009-08-2009-08-13",则结果将是:

mv "2009-08-2009-08-13" "2009-08-whatever_2009-08-13"

名称不属于该格式的文件将被跳过。

尝试这个:

#!/bin/bash

my_var_till="whatever"

for f in *
    # test if file is proper format
    echo "${f}"|grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{4}-[0-9]{2}-[0-9]{2}$'>/dev/null
    if [ $? -eq 0 ]; then
        n=$(echo ${f}|sed -r 's/^(.{8})(.{10})$/'"\1${my_var_till}_\2/")
        mv "${f}" "${n}"
    fi
done

相关内容