【问题标题】:Bash: include formatted date to a rename regexBash:在重命名正则表达式中包含格式化日期
【发布时间】:2018-04-24 06:57:40
【问题描述】:

我有一个脚本可以监控列表 ($docs) 中的一组文件夹名称。 如果它找到 not empty 文件夹,它应该: 重命名和移动文件并为其添加时间戳。

这是我目前得到的:

docs="/home/user/docs.txt"

cat $docs | while read line
do
if find "$line" -mindepth 1 -print-quit | grep -q .; then
   find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3
else
   echo "empty folders" $line
fi
done

文件 docs.txt 是一组文件夹,如下所示:

/foldername
/anotherfoldername

此脚本正确重命名我的文件(folderplacement_filename.ext),并将它们移动到 /temp/ 目录。

但挑战是附加一个“日期+%d%m%Y%H%M%S”字符串,我找不到任何方法可以优雅地将其添加到我的重命名字符串中。

添加 $(date),忽略任何额外的格式。

例如将其附加到重命名 's:(^|./)([^/])/([^/]*)$:/tmp/$2$3$(date) 给出类似“folderplacement_filename.ext 4 24 35 20 48 111 123 321”的文件名

我希望文件看起来像“folderplacement_filename11102017011632.ext”(在 .ext 之后附加日期也可以。)

这可能是我需要以正确的方式引用或括号的内容,但我无法弄清楚。

【问题讨论】:

    标签: regex bash rename


    【解决方案1】:

    我没有重命名的经验,但我建议在该行的末尾缺少一个引号。

    如果您使用单引号,shell 不会为您扩展变量。这意味着命令参数的最后一部分实际上是$(date),这不是您想要的。您可以使用双引号,但这意味着您需要使用反斜杠转义所有 $。或者您可以将日期部分放在单引号之外,如

    now=$(date +%d%m%Y%H%M%S)
    find $line -type f | rename 's:(^|.*/)([^/]*)/([^/]*)$:/tmp/$2$3'$now
    

    【讨论】:

    • 谢谢!这让我走上了正确的道路。我通过双引号和转义 $'es 解决了它: rename "s:(^|.*/)([^/]*)([^/]*)/([^/]*)\$:/ tmp/$now_\$2\$3\$4:" 您发现丢失的 ' 也是正确的,这是脚本中找不到的错字。
    猜你喜欢
    • 2020-01-19
    • 2019-02-14
    • 2016-08-22
    • 2017-05-30
    • 2012-10-09
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多