该脚本以某种模式创建文件名,并删除以前以相同模式创建的文件(如果有)?

该脚本以某种模式创建文件名,并删除以前以相同模式创建的文件(如果有)?

我想编写一个脚本,创建一个文件,该文件将主机名和日期存储在 YEARMONTHDAYHOURMINSEC 中,并打印系统中的所有环境变量,并删除目录中以前创建的所有文件(如果有),否则创建一个新文件。

因此,脚本应该搜索目录并删除该模式中的前一个文件,但不应删除其他文件。

#!/bin/bash

time=$(date +"%Y%m%d%H%M%S")
echo $(hostname) >>env.$time.txt
echo date:$time >>env.$time.txt
echo $(env)>>env.$time.txt
cat env.$time.txt

答案1

对现有脚本的一个简单修复是:

#!/bin/bash

# set location of backup such as `/var/log`
envDir=/path/to/dir

mkdir -p $envDir/junk

mv $envDir/env.*.txt $envDir/junk 2> /dev/null

time=$(date +"%Y%m%d%H%M%S")
echo $(hostname) >> $envDir/env.$time.txt
echo date:$time >> $envDir/env.$time.txt
echo $(env)>>$envDir/env.$time.txt
cat $envDir/env.$time.txt

rm $envDir/junk/*

请注意,有些事情可以改进,例如您的echo $(env),这会产生实际上无法使用的数据。相反,您应该这样做,因为env它将被行分隔,并且易于导入。

文件名也可以提前定义,以简化设置等代码并使其更易于维护。

这是一个稍微改进的版本,带有附加注释:

#!/bin/bash

# set location of backup such as `/var/log`
# !!! Update this!
envDir=/path/to/dir

# set backup time
time=$(date +"%Y%m%d%H%M%S")

# set full file name for the backup
envFile=$envDir/env.$time.txt

# make temporary directory and ignore if it already exists
mkdir -p $envDir/junk

# move existing environment backup files to junk until we have our new output
mv $envDir/env.*.txt $envDir/junk 2> /dev/null

hostname >> $envFile
echo date:$time >> $envFile
env >> $envFile
cat $envFile

# remove the backup(s)
rm $envDir/junk/*

答案2

我已经测试过这个脚本并且它有效。该脚本创建一个新文件并删除用户主目录中的旧文件(如果存在)。

#!/bin/bash
DATETIME=$(date +"%Y%m%d%H%M%S")
rm ~/env.*.txt
echo "$(hostname)
date:$DATETIME
$(env)" | tee ~/env.$DATETIME.txt

第一的,更改dateDATETIME因为date似乎更有可能已被定义。

下一个, rm ~/env.*.txt使用 glob 作为通配符删除用户 $HOME 目录或 ~/ 中的任何文件,以便仅匹配文件名的静态或固定部分。

如果使用该脚本创建的任何输出文件应该对此进行处理,并且应该从主目录中删除。

如果文件不存在,用户应该在终端中收到一条输出错误消息,表明该文件不存在。可以忽略此消息,并且在脚本运行的任何后续时间中不应存在此消息。

另外,我使用T恤tee而不是>>出于习惯,因为T恤通常不会出现任何问题。

最后echo在这里不需要使用多次。我在第一行使用了开放式双引号,包括要写入文件的接下来两行,并在最后一行以封闭式双引号结束,然后通过管道将输出tee写入文件。

使用时tee,写入文件的内容将在终端中打印,因此cat显得多余。

此外,您可以使用以下-a标志将输出作为新行附加到任何现有文件的末尾:teetee -a

相关内容