复制文件并附加时间戳

Bri*_*ian 16 shell-script date file-copy timestamps

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

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")
Run Code Online (Sandbox Code Playgroud)

以上添加Test2为文件名,但我希望它保留原始源文件的文件名,在本例中名为Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")
Run Code Online (Sandbox Code Playgroud)

另一个问题是,当我添加%r时间戳代码时,我收到错误消息,指出目标“PM”不是目录。我试图将时间戳记为 12 小时制。

Gil*_*il' 15

您的问题之一是您省略了命令替换周围的双引号,因此命令的输出date以空格分隔。请参阅为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?这是一个有效的命令:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"
Run Code Online (Sandbox Code Playgroud)

如果要附加到原始文件名,则需要将其放在变量中。

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"
Run Code Online (Sandbox Code Playgroud)

如果您使用 bash,则可以改用大括号扩展。

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}
Run Code Online (Sandbox Code Playgroud)

如果您想将文件复制到不同的目录,并将时间戳附加到原始文件名,您可以这样做 -${source##*/} 扩展source没有部分的值直到最后/(它删除与模式匹配的最长前缀*/):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"
Run Code Online (Sandbox Code Playgroud)

如果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")"
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

60233 次

最近记录:

10 年,4 月 前