我有一些这样的文件:
2012-12-17_083213_1.log
2012-12-17_083213_1.log_stats
2012-12-17_083213_1.logaccount_ptr
2012-12-17_083213_1.loginitial_ptr
2012-12-17_083213_1.logptr
2012-12-17_093049_2.log
2012-12-17_093049_2.log_stats
2012-12-17_093049_2.logaccount_ptr
2012-12-17_093049_2.loginitial_ptr
2012-12-17_093049_2.logptr
在这里,每 1G 数据都会创建一个新文件,其名称采用 Year-Month-Day_HourMinuteSecond_number.log 格式(如上所示)。
我想要
- 将所有 *.log 文件复制到以“年-月-日”格式命名的新文件夹,因此这些文件的名称为:2012-12-17
tgz
那个文件夹- 将其发送到服务器IP。
我不知道具体是怎样的。我希望它作为 bash 脚本,这样我就可以每天为新添加的文件运行它。
答案1
我会复制一个脚本给你,但是下次做一些研究首先尝试自己写。这是唯一的学习方法。并且,请不要在不理解的情况下使用它。
#!/bin/bash
tosend=""
for i in *.log; do
dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
if [ ! -d $dir ]; then
mkdir $dir;
fi;
cp $i $dir;
tosend="$tosend\n$dir"
done
for i in $(echo -e $tosend | uniq);do
echo Compressing $i
tar -zcvf $i.tar.gz $i
scp $i.tar.gz user@server
done
关键部分是使用 awk 分割文件名,然后保留已修改的文件夹列表。它不是最优雅的,但很有效。
请注意,如果您复制这些文件,下次运行它们时将再次复制它们。最好的办法就是移动它们。
顺便说一句,我添加了该uniq
部分,而不是将名称添加到 if 内的“数组”中,因为当您运行脚本时这些文件夹可能已经存在。
但是,如果您只想发送新文件并在午夜运行它,这可能是最好的方法:
#!/bin/bash
tosend=""
for i in *.log; do
dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
if [ ! -d $dir ]; then
mkdir $dir;
tosend="$tosend\n$dir"
fi;
mv $i $dir;
done
for i in $tosend;do
echo Compressing $i
tar -zcvf $i.tar.gz $i
scp $i.tar.gz user@server
done
这只会发送新的文件夹(即使一些旧的可能有新文件)。并且主mv
文件夹将保持干净。
对于更复杂/防弹的方法,我认为 rsync 是最好的选择。