如何将多个文件的 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