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

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

我正在学习Linux命令。

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

以下是文件名示例。它已更新了计时信息。如何通过替换:来命名它_

ee_Sun_Aug_11_22:20:27_GMT-8_2019.txt

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

$ cp /var/log/ee.txt ee_`date`.txt
cp: target `2019.txt' is not a directory

答案1

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

for name in ./*:*.txt; do
    newname=${name//:/_}
    mv -i "$name" "$newname"
done

或者,更短,

for name in ./*:*.txt; do
    mv -i "$name" "${name//:/_}"
done

参数替换${name//:/_}会将所有内容更改:_值中的任何位置$name(上述 shell 也支持 ksh93 运算符)。

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

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


你的命令

cp /var/log/ee.txt ee_`date`.txt

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

以下内容会效果更好:

cp /var/log/ee.txt "ee_$(date).txt"

它效果更好,不是因为我将你的反引号更改为,$(...)而是因为我双引号了新名称。

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

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

cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"

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

或者,

cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"

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

相关内容