сценарий для группировки каталогов случайного диапазона в заданном порядке с использованием сценария оболочки

Linux обычно имеет GNU sed, OS X использует sed от BSD. Адрес '/ pattern /, + 1' является расширением GNU, он не будет работать с другими реализациями sed.

Что может сработать, так это следующее (присоединение строки к следующей, затем удаление строки):

/pattern$/N; /pattern/d

По крайней мере, это сработало в OS X 10.10. Обратите внимание на разные узоры.

Поскольку ваша цель - управлять XML-файлом, sed - не лучший инструмент для начала. Например, взгляните на Python и его модуль lxml (не часть стандартной библиотеки Python); эта комбинация сработала для меня.

1
08.04.2018, 20:32
3 ответа

Математика несколько хитрая. Простое целочисленное деление (file/50000+1)*50000не удастся. Если номер файла 50000, результат будет 100000. Не то, что вы хотите. Нам нужен сдвиг происхождения:

$(( ((file-1)/50000+1)*50000 ))

Также допустима более простая схема кода:

#!/bin/bash
fsource=/opt/dms;    fdest=/opt/nes_dms;    istep=50000
cd "$fsource"
for f In *; do
    i=$(( 1+(f-1)/istep ))              # Which bucket?
    fd="$fdest/$(( istep*i ))"
    echo  \
    mv -t "$fd" "$f"
done

Добавление пары проверок [ (каталог?)И (только цифры )]:

#!/bin/bash
fsource=/opt/dms/;     fdest=/opt/nes_dms;     istep=50000
for f in "$fsource"/*; do
    [[ -d $f ]] || continue           # Is a dir?
    i=${f##*/}                        # Remove path.                                                  
    [[ $i =~ ^[0-9]+$ ]] || continue  # Only digits?                                                  
    i=$((1+(i-1)/istep))              # Which bucket?
    fd="$fdest/$(( istep*i ))"
    echo  \
                       mv -t "$fd" "$f"
done

Закомментируйте эхо, когда вы довольны значениями и хотите выполнить ходы.

1
27.01.2020, 23:23

ПРЕДУПРЕЖДЕНИЕ:Приведенный ниже сценарий не обрабатывает ошибки, если имя каталога не является числовым.

Возможное решение:

#!/bin/bash
#set -x

SOURCE=/opt/dms/
DEST=/opt/nes_dms

for dir in `ls $SOURCE | sort -n`
do

  # define destination subdir
  dst_dir=$(( (($dir/50000) + 1) * 50000 ))

  # check if destination subdir exists
  if [ ! -d $DEST/$dst_dir ]
  then
    mkdir $DEST/$dst_dir
  fi 

  mv $SOURCE/$dir $DEST/$dst_dir

done
1
27.01.2020, 23:23
#!/bin/bash
#set -x
#Please pass document library path
SOURCE='/crypto/home/hl/tmp/stackexchange/dir_groups/source'
DEST='/crypto/home/hl/tmp/stackexchange/dir_groups/target'
declare -a target_dir_indexes
cd "$SOURCE" || exit 1
for dir in *; do
    test "$DEBUG" = 'yes' && echo "$dir"
    test -d "$dir" && ! test -L "$dir" || continue
    if ! [[ "$dir" =~ ^(0|[1-9][0-9]*)$ ]]; then
        echo "error: dir name '${dir}'; skipping"
        continue
    fi
    target_index=$((dir/50000))
    if [ "$dir" -gt 0 ]; then
        if [ $((dir%50000)) -eq 0 ]; then
            ((target_index--))
        fi
    fi
    target_dir_name=$(((target_index+1)*50000))
    target_dir_path="${DEST}/${target_dir_name}"
    # avoid unneccessary calls to mkdir or the VFS
    if [ -z "${target_dir_indexes[target_index]}" ]; then
        mkdir -p "$target_dir_path"
        target_dir_indexes[target_index]=1
    fi
    echo "${dir} is moved to ${target_dir_name}"
    mv -i "$dir" "$target_dir_path"
done
1
27.01.2020, 23:23

Теги

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