Пакетное копирование в несколько каталогов

Пакетное копирование в несколько каталогов

У меня есть около 9000 файлов в каталоге, и я хочу переместить их в 90 файлов в 100 каталогах в порядке имен файлов, игнорируя все остальное. ВКопировать несколько файлов из файла с именем X в файл с именем Y?,Калебнаписал вкомментарий:

Если цель состоит только в том, чтобы обработать их пакетно, есть НАМНОГО более простой способ! ls | xargs -iX -n20 cp X target_folder/Запускать cp для файлов пакетами по 20 штук, пока они все не будут обработаны.

Итак, основываясь на использовании xargs, как я могу переключить target_folder, чтобы создать новую папку и выполнить команду 100 раз?

решение1

В 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

Эта команда не похожа на то, что вы пытаетесь сделать. 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

решение3

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

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

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

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)

Связанный контент