Команда для создания последовательно пронумерованных целевых каталогов и пакетных файлов перемещения

Для 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
1
задан 29 December 2014 в 11:39

3 ответа

Если вы не против того, чтобы все было перемещено отдельно:

#! /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.

3
ответ дан 24 May 2018 в 00:37
  • 1
    Что означает move-7 в конце? – αғsнιη 31 December 2014 в 12:35
  • 2
    @KasiyA bash -c принимает в качестве первого аргумента значение для $0. Он не используется напрямую, но сообщения об ошибках будут использовать этот аргумент. – muru 31 December 2014 в 12:55
  • 3
    @KasiyA см. unix.stackexchange.com/q/152391/70524 – muru 31 December 2014 в 12:58
  • 4
    Хорошая информация. и предложение вместо TARGET=target-$((${1//[^0-9]/} / 7 + 1)) – αғsнιη 31 December 2014 в 14:09
Команда
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
2
ответ дан 24 May 2018 в 00:37
[F1]
1
ответ дан 24 May 2018 в 00:37

Другие вопросы по тегам:

Похожие вопросы: