Для Ubuntu 14.04, по крайней мере, ответ klrmr выше - правильный ответ. Кажется, что не нужно устанавливать DISPLAY или формулировать полные пути для уведомления-отправки или что-либо иное, как правило, в $ PATH.
Ниже приведен сценарий cron, который я использую для выключения виртуальной машины, когда состояние батареи ноутбука становится слишком низким. Настройка линии DBUS_SESSION_BUS_ADDRESS в ответе klrmr выше - это модификация, которая, наконец, правильно обработала предупреждения.
#!/bin/bash
# if virtual machine is running, monitor power consumption
if pgrep -x vmware-vmx; then
bat_path="/sys/class/power_supply/BAT0/"
if [ -e "$bat_path" ]; then
bat_status=$(cat $bat_path/status)
if [ "$bat_status" == "Discharging" ]; then
bat_current=$(cat $bat_path/capacity)
# halt vm if critical; notify if low
if [ "$bat_current" -lt 10 ]; then
/path/to/vm/shutdown/script
echo "$( date +%Y.%m.%d_%T )" >> "/home/user/Desktop/VM Halt Low Battery"
elif [ "$bat_current" -lt 15 ]; then
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";
notify-send -i "/usr/share/icons/ubuntu-mono-light/status/24/battery-caution.svg" "Virtual machine will halt when battery falls below 10% charge."
fi
fi
fi
fi
exit 0
Если вы не против того, чтобы все было перемещено отдельно:
#! /bin/bash
for ((i = 1; ; i++))
do
mkdir -p target-$i
for j in $(seq $((i*7 - 6)) $((i*7)))
do
mv -t "target-$i" "source/image$j.tiff" || exit 1
done
done
Или, более кратким:
find source -type f -name 'image*.tiff' -print0 | \
sort -z --version-sort | \
xargs -0n7 bash -c 'TARGET=target-$((${1//[^0-9]/} / 7 + 1)); \
echo mkdir -p "$TARGET"; \
echo mv -t "$TARGET" "$@"' move-7
Объяснение:
-print0 печатает имена файлов, разделенные символом NUL (\0). Это самый безопасный способ передачи имен файлов в качестве вывода в другие команды. sort с -z ищет вход с нулевым разграничением, а сортировка версии позволяет безопасно сортировать номера переменной длины, так что image2.tiff до image119.tiff xargs может ограничить количество аргументов, применяемых к каждой команде с -n, поэтому здесь мы используем -n7. [F13] для ввода с нулевым ограничением. Мы извлекаем фактор числа первого аргумента $((${1//[^0-9]/} / 7 + 1)) - ${1//[^0-9]/} удаляет все в аргументе, который не является числом. Целочисленное деление гарантирует, что мы получим коэффициент. Это должно быть быстрее, так как мы выполняем ровно число mv s.Осмотрите полученные команды, и если они выглядят нормально, запустите его снова после удаления echo s.
KasiyA имеет интересную модификацию.
]интересная модификация приносит rename на ум. Во-первых, сделайте все каталоги:
FILES=(source/image*.tiff)
COUNT=${#FILES[@]}
DIR_NUM=$((COUNT / 7 + 1))
seq 1 $DIR_NUM | xargs bash -c 'mkdir -p "${@/#/target-}"'
rename -n 's;source/image(\d+)\.tiff$;"target-".int($1 / 7 - 1)."/image".$1.".tiff";e' source/image*.tiff
На самом деле мы могли бы применить первые четыре строки ко всем решениям здесь и пропустить повторную mkdir -p.
sevenfile=0
newdir=1
for file in `ls -v /path/to/source/image*.tiff` ; do
mkdir -p "$newdir" && mv "$file" "$newdir"
[[ ++sevenfile -eq 7 ]] && sevenfile=0 && ((newdir++))
done
ls -v сортирует файлы как естественные номера (версии). Вы можете проанализировать команду ls в этом случае, потому что все файлы являются конкретными и являются только image*.tiff. mkdir -p $newdir разбивает каталог на основе переменной newdir. mv "$file" "$newdir" перемещает файл в каталог, указанный newdir. Сбросьте значение sevenfile=0 до нуля, когда было перемещено 7 файлов ([[ ++sevenfile -eq 7 ]]) и увеличьте значение newdir. Обратите внимание, что изменение /path/to/source/ в ваш фактический исходный каталог.
Если вы не хотите разбирать команду ls и имя файла, включая пробелы, символы новой строки и т. д.: [ ! d9]
find /path/to/source/ -type f -name 'image*.tiff' -print0 | \
sort -z --version-sort | while IFS= read -d '' -r file; do \
mkdir -p "$newdir" && mv "$file" "$newdir" ;
[[ ++sevenfile -eq 7 ]] && sevenfile=0 && ((newdir++));
done