2017-11-11 172 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