Пакетная копия к нескольким каталогам

Паузы и фоны задание, каждый замораживает его на месте. С Z Вы возвращаетесь к терминалу и можете выполнить команды как bg продолжать задание в фоновом режиме или fg продолжаться на переднем плане. С S Вас просто оставляют с замороженной программой, бросающейся Вам в глаза.

5
13.04.2017, 15:36
3 ответа

Та команда не смотрит близко к тому, что Вы пытаетесь сделать. xargs может помочь, но это является громоздким для использования, если Вы не знаете, что Ваши имена файлов не содержат пробела или символа заключения в кавычки. Вот цикл оболочки, который диспетчеризирует файлы в недавно созданные подкаталоги, 90 на каталог.

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory
1
27.01.2020, 20:41
  • 1
    xargs также имеет опцию -0 который выключает обработка кавычки и пробел. Но я соглашаюсь, что этот вид сценария является лучшим подходом. –  James Youngman 07.07.2012, 20:12
  • 2
    xargs также имеет опцию -0 который выключает обработка кавычки и пробел. Но я соглашаюсь, что этот вид сценария является лучшим подходом. –  James Youngman 07.07.2012, 20:12
  • 3
    @Gilles Там является ошибкой в сценарии: $slice должен быть $args –  daniel kullmann 07.08.2012, 10:26
  • 4
    @Gilles Там является ошибкой в сценарии: $slice должен быть $args –  daniel kullmann 07.08.2012, 10:26

В bash, попробуйте следующий код:

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

Запустите скрипт как этот:

./script.bash *
2
27.01.2020, 20:41

parallel поддерживает выполнение нескольких команд с \; и {#} является порядковым номером:

ls|parallel -n90 mkdir {#}\;mv {} {#}

Или если имена файлов не содержат пробелов, кавычек или обратных слэшей:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)
0
27.01.2020, 20:41

Теги

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