我的脚本有两个问题,该脚本复制文件并向名称添加时间戳。
cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")
上面添加了Test2
文件名,但我希望它保留原始源文件的文件名,在本例中名为Test
.
cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")
另一个问题是,当我添加%r
作为时间戳代码时,我收到错误消息,指出目标“PM”不是目录。我正在尝试获取 12 小时制时间戳。
答案1
您的问题之一是您遗漏了命令替换周围的双引号,因此date
命令的输出被空格分割。看为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?这是一个有效的命令:
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"
如果要附加到原始文件名,则需要将其放在变量中。
source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"
如果您使用的是 bash,则可以使用大括号扩展。
cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}
如果您想将文件复制到不同的目录,并将时间戳附加到原始文件名,您可以这样做 -${source##*/}
扩大source
到最后一个部分的值/
(它删除与模式匹配的最长前缀*/
):
source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"
如果Test1
是一个目录,则会递归复制,并且目录内的文件保留其名称:只有顶级目录会附加时间戳(例如Test1/foo
复制到Test1-05-10-15-07:19:42 PM
)。如果您想将时间戳附加到所有文件名,那就是另一个问题了。
您选择的时间戳格式是一个坏主意:人类很难阅读并且难以排序。您应该使用一种更易于阅读且易于排序的格式,即按重要性递减顺序排列各部分:年、月、日、小时、分钟、秒,并且日期部分和时间部分之间分开。
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"
答案2
如果原始文件名是 test1.txt,则此复制语句会复制该文件并将日期时间戳连接到当前目录中的原始文件名上:
cp test1.txt{,.$(日期+%Y%m%d%H%m%s)}
相同的格式字符串(“+”后面的部分)可以按照其他人的建议使用“%r”,但 +r 生成的时间格式是“HH:MM:SS AM|PM”,我不喜欢嵌入空白或冒号。
归因:这不是我自己的创作,我在某个地方的评论中找到了它,在一个不相关主题的评论中。