Linux обычно имеет GNU sed, OS X использует sed от BSD. Адрес '/ pattern /, + 1' является расширением GNU, он не будет работать с другими реализациями sed.
Что может сработать, так это следующее (присоединение строки к следующей, затем удаление строки):
/pattern$/N; /pattern/d
По крайней мере, это сработало в OS X 10.10. Обратите внимание на разные узоры.
Поскольку ваша цель - управлять XML-файлом, sed - не лучший инструмент для начала. Например, взгляните на Python и его модуль lxml (не часть стандартной библиотеки Python); эта комбинация сработала для меня.
Математика несколько хитрая. Простое целочисленное деление (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
Закомментируйте эхо, когда вы довольны значениями и хотите выполнить ходы.
ПРЕДУПРЕЖДЕНИЕ:Приведенный ниже сценарий не обрабатывает ошибки, если имя каталога не является числовым.
Возможное решение:
#!/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
#!/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