我运行此 bash 脚本,以便将今天具有以下格式的所有文件放入同一文件夹中。例如,这里我想2012-12-17_083213
成为我的文件夹,然后在它里面我有和.log
等等.log_stats
,里面有这个名字?
但我无法让脚本工作。例如,如果我尝试一切直到然后dir=$(echo $i | awk '{split($1,a,"_"); print a[1]}');
为了测试它,我做了 echo $dir ,并显示以下内容:
fwui.log
我搜索并理解了它关于数据库中的锁,但如何解决它?
这是脚本:
#!/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
这是文件格式:
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
答案1
首先将 awk 的第一行更改为:
dir="$(echo "$i" | awk '{split($0,a,"_"); printf "%s_%s",a[1],a[2]}')"
这样,如果它们包含空格,它仍然可以工作。
然后将“for i in”行替换为:
echo -e "$tosend" | grep -v '^$' | sort | uniq | while IFS= read i ;do
并在相关位置添加一些“”:
#!/bin/bash
tosend=""
for i in 20*.log*; do
dir="$(echo "$i" | awk '{split($1,a,"_"); printf "%s_%s",a[1],a[2]}')";
if [ ! -d "$dir" ]; then
mkdir "$dir" || { echo "ERROR during: mkdir '$dir'" ; exit 1 ; };
fi;
cp "$i" "$dir" || { echo "ERROR during: cp '$i' '$dir'" ; exit 2 ; };
tosend="${tosend}\n${dir}"
done
echo -e "$tosend" | grep -v '^$' | sort | uniq| while IFS= read i ;do
echo "Compressing $i"
echo REMOVE THIS ECHO ONCE TESTED tar -zcvf "${i}.tar.gz" "$i" \
&& { echo REMOVE THIS ECHO ONCE TESTED scp "${i}.tar.gz" user@server:/tmp/somedir/ \
|| { echo "ERROR during: scp '${i}.tar.gz' user@server:/tmp/somedir/" ; exit 4 ; };
}
|| { echo "ERROR during: tar -zcvf '${i}.tar.gz' '$i'" ; exit 3 ; };
done
您可能需要取出 tar 中的“v”部分,以保存一些显示(一旦您知道它可以工作)
上述的另一种方式:
替换我的
for i in 20*.log*; do
和:
ls -1d *|grep '^[0-9]*-[0-9]*-[0-9]*_[0-9]*_[0-9]*\.log.*'| while IFS= read i ; do
或者简化 grep :
ls -1d *|grep '^[0-9_-]*\.log' | while IFS= read i ; do
这应该足够了(但可以匹配“./-_-1234.log.hahaha”文件...)
答案2
你应该从for i in *.log*; do
;for i in *.log; do
开始否则你只会得到这样的文件结束在.log
。除了可以更简单地重写之外,我在您的脚本中看不到任何其他问题。