私はこの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
。より簡単に書き直すことができる以外に、スクリプトに他の問題はありません。