复制文件并附加时间戳


13

我的脚本有两个问题,该脚本复制文件并为该名称添加时间戳。

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小时制。


添加AM / PM在文件名中添加额外的空间。如果您坚持要这样做,请尝试执行以下操作:cp -ra / home / bpacheco / Test1“ / home / bpacheco / Test2-$(date +%m-%d-%y-%r)”
罗密欧·尼诺夫

2
date +"%m-%d-%y-%I:%M:%S_%p"
don_crissti 2015年

Answers:


12

您的问题之一是您在命令替换处省略了双引号,因此命令的输出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")"

吉尔斯(Gilles),第一个命令无法使用恕我直言,请检查双引号的位置。看看我对这个问题的评论
罗密欧·尼诺夫

@RomeoNinov第一条命令出了什么问题?您运行它并收到错误消息吗?
吉尔斯(Gilles)'所以

您是对的,日期命令在子
外壳中

Gilles,使用您的上述示例,我如何将具有上述时间戳信息的文件复制到另一个目录。以下命令不起作用:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian

@Brian我不确定我是否理解您的评论,但请参阅我的编辑。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.