2017-10-17 84 views
0

我有一个文件的目录,我需要使用时间戳重命名为给定的字符串。For循环删除文件而不是重命名

我使用下面的代码:

for file in itvl_* 
do 
    mv "$file" "Interval_$(stat -c %Y "$file" | date +%Y%m%d%H%M%S).Interval_001" 
done 

当我运行在符合给定的面具itvl_ *文件的目录的脚本,它会删除所有,但一个或两个文件,然后成功地重命名组中的最后一个文件。

这里可能会发生什么?

+2

你的“秒”不足以区分文件 - bash可能在同一秒内重命名所有文件的大部分,创建具有相同文件名的多个文件。 – Raizuri

+1

'日期'不从标准输入中读取;您所做的只是将当前日期/时间用于新文件名。你希望'$(date +%Y%m%d%H%M%S --date $(stat -c%Y“$ file”))'将'stat'的结果用作'date的参数'。 – chepner

回答

1

它不会删除所有的文件,它只是简单地将它们全部重命名为相同的目标名称。

您可以通过运行看出来:

for file in itvl_* 
do 
    echo "Interval_$(stat -c %Y "$file" | date +%Y%m%d%H%M%S).Interval_001" 
done 

其结果是,它们将覆盖彼此只有最后一个幸存。