Я скопирую Вас сценарий, чтобы сделать это, но в следующий раз проводят некоторое исследование сначала и пытаются записать это собой. Это - единственный способ учиться. И, не используйте его, не понимая его.
#!/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 для разделения имени файла и затем сохраняет список папок, которые Вы изменили. Это не является самым изящным, но это работает.
Обратите внимание при копировании файлов, в следующий раз, выполнение его, они будут скопированы снова. Лучшая вещь состояла бы в том, чтобы переместить их.
Btw, я добавил uniq
часть вместо того, чтобы добавить имя к "массиву" в, если, потому что возможно, что папки уже существуют, когда Вы запускаете скрипт.
Однако, если Вы только хотите отправить новые файлы, и Вы выполняете его в полночь, это - вероятно, лучший подход:
#!/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 является лучшим выстрелом.
Вы ищете хвоста
:
ls -ltr | tail -n 1
Это отобразится только последняя строка выхода LS -LTR
. Вы можете управлять количеством линий, изменив значение после -N
; Если вы опускаете -N 1
полностью вы получите десять строк.