2017-11-11 169 views
0

我有一个脚本,用于监视列表($ docs)中的一组文件夹名称。 如果它发现不是空的文件夹,它应该:重命名和移动文件并追加一个时间戳它。Bash:将格式化日期包含到重命名正则表达式中

这是我走到这一步:

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”字符串,我无法找到任何方法将其优雅地添加到我的重命名字符串中。

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

例如追加它重新命名的:(^ | /。)([^ /])/([^ /] *)$:/ TMP/$ 2 $ 3 $(日期) 给出的文件名像 “folderplacement_filename.ext 4 24 35 20 48 111 123 321”

我想要的文件,看起来像 “folderplacement_filename11102017011632.ext”(附加日期后.EXT也行。)

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

回答

0

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

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

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

谢谢!这让我走上了正轨。我通过双引号和转义解决了$'es:rename's:(^ |。* /)([^ /] *)([^ /] *)/([^ /] *)\ $:/ tmp/$ now \ _ \ $ 2 \ $ 3 \ $ 4:“您在发现丢失的内容时也是正确的,这是在脚本中找不到的错字。 – Stian