如何更改时间信息中包含“:”的文件名

use*_*779 2 linux filenames timestamps

我正在学习 Linux 命令。

使用时序信息重命名文件名时,会:自动分配标记。我怎样才能把这个:标志改成_

下面是一个文件名示例。它已更新时间信息。如何通过更换命名它:_

ee_Sun_Aug_11_22:20:27_GMT-8_2019.txt
Run Code Online (Sandbox Code Playgroud)

另外,为什么下面不起作用?

$ cp /var/log/ee.txt ee_`date`.txt
cp: target `2019.txt' is not a directory
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

要遍历当前目录:中名称中至少包含一个字符并以 结尾的所有文件,并将字符.txt更改:_,使用 ksh93、zsh、bash、mksh shell(或最新版本的 busybox sh),您可以用

for name in ./*:*.txt; do
    newname=${name//:/_}
    mv -i "$name" "$newname"
done
Run Code Online (Sandbox Code Playgroud)

或者,更短,

for name in ./*:*.txt; do
    mv -i "$name" "${name//:/_}"
done
Run Code Online (Sandbox Code Playgroud)

参数替换${name//:/_}将所有改变:_在任意位置的值$name(一个ksh93的操作员也由壳体支持上面提到的)。

mv -i会重命名文件,但会要求确认如果新名称已被使用。

您作为示例显示的文件名将更改为ee_Sun_Aug_11_22_20_27_GMT-8_2019.txt.


你的命令

cp /var/log/ee.txt ee_`date`.txt
Run Code Online (Sandbox Code Playgroud)

不起作用,因为date输出一个带有空格的字符串。这些空格会让cp您认为您想将多个文件复制到一个目录中。因此,“不是目录”错误。

以下方法效果会更好:

cp /var/log/ee.txt "ee_$(date).txt"
Run Code Online (Sandbox Code Playgroud)

它工作得更好,不是因为我把你的反引号改成了,$(...)而是因为我用双引号引用了新名称。

这将创建文件ee_Sun Aug 11 16:57:37 CEST 2019.txt(或类似的东西)。

为了获得更简洁的文件名,您可能需要date更精确地指定输出格式:

cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"
Run Code Online (Sandbox Code Playgroud)

格式字符串%F_%H-%M-%Sstrftime(3)在您的系统手册 ( man 3 strftime) 或date命令手册中进行描述,您最终会得到类似ee_2019-08-11_16-59-55.txt. 如果您date不支持该%F指令,则可以替换为%Y-%m-%d.

或者,

cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"
Run Code Online (Sandbox Code Playgroud)

(让date命令格式完成创建新文件名的大部分工作)