Как безопасно перемещать и переименовывать файлы на основе REGEX в правильно названные каталоги

Чтобы заставить Gridengine запланировать вашу 20-ядерную работу на одном узле, вам придется создать новую параллельную среду или настроить ту, которую вы используете. Вам нужна установка

allocation_rule    $pe_slots

Изman sge_pe:

If the special denominator $pe_slots is used, the full range of processes as specified with the qsub(1) -pe switch has to be allocated on a single host.

Не забудьте прикрепить новый PE к вашей очереди.

Чтобы устранить проблему с источником, выполняя задание MPI более чем на одном узле, вы можете открыть второй вопрос с более подробной информацией об этом.

4
01.12.2019, 16:17
2 ответа

С zshвы можете использовать другой подход, основанный на его функции приблизительного соответствия:

autoload zmv # best in ~/.zshrc
zmodload zsh/stat

dest=~/Categories
categories=(television lightbulb motorcar etc)
mkdir -p -- $dest/${(C)^categories}

zmv -n '(**/)(*[^0-9])<->(.*)' \
       '$dest/${c::=${${(CM)categories:#(#a3)$2}:-unknown}}/$c-$(
          zstat -F %FT%T%z +mtime -- $f)$3'

${(M)categories:#(#a3)$2}ищет$2(часть перед числом )в массиве categories, допуская до трех ошибок(различных символов, транспонирования, вставки, удаления ).

Снимите-n(сухой -прогон ), если он в порядке.

Для вашего подхода это может быть что-то вроде:

autoload zmv # best in ~/.zshrc
zmodload zsh/stat

dest=~/Categories
typeset -A categories

categories=(
  levis Television
  ghtbu Lightbulb
  otorc Motocar
)

mkdir -p -- $dest/$^categories

for k (${(k)categories}) (
  zmv -n "(**/)*$k*(.*)" '$dest/$categories[$k]/$categories[$k]-$(
          zstat -F %FT%T%z +mtime -- $f)$2'
)

Или, если общие символы всегда с 3 й по 7 й:

autoload zmv # best in ~/.zshrc
zmodload zsh/stat

dest=~/Categories

categories=(Television Lightbulb Motocar)

mkdir -p -- $dest/$^categories

for c ($categories) (
  zmv -n "(**/)*$c[3,7]*(.*)" '$dest/$c/$c-$(
          zstat -F %FT%T%z +mtime -- $f)$2'
)
2
27.01.2020, 21:00

Вероятно, не самый эффективный способ, но я бы перевернул проблему с ног на голову и сопоставил строки в именах файлов с каталогами и, поскольку текущее перечисление является случайным, просто подсчитал их, чтобы сохранить уникальность.

homedir=~/Categories
eval homedir=$homedir

cats="Television Lightbulb Bananas Motorcar"
declare -A count

for cat in $cats; do if [ ! -d $homedir/$cat ]; then mkdir -p $homedir/$cat; fi; done

while read f; do
    r=${f##*/}
    r=${r%.*}
    r=$(grep -Po "[a-z]+" <<<$r)
    for cat in $cats; do
        if [ $(grep -i "$r" <<< $cat) ]; then
            ((count[$cat]++))
            mv "$f" $homedir/$cat/$cat-$(printf "%03g" ${count[$cat]}).${f##*.}
        fi
    done
done <<< $(find./banana/ -type f) 

Совпадения, отличные от -, автоматически выходят из цикла grepи остаются на месте для особого внимания позже.

Все, что вы хотите включить в композицию имени файла, может быть включено, дата последнего изменения будет

$(stat -c %Y $f)

и т. д.

-1
27.01.2020, 21:00

Теги

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