我正在学习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 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")"
(让date
命令格式完成创建新文件名的大部分工作)