CentOS пытается смонтировать несуществующий RAID-массив -> режим восстановления

Далее будет создан подкаталог с именем new , а затем 50 пронумерованных подкаталогов в new с именем new / 01 .. new / 50 . Затем он переместит максимум 1000 файлов из текущего каталога в каждый из каталогов new / * .

ПРИМЕЧАНИЕ 1. Это не будет работать, если в каком-либо из имен файлов есть символы новой строки ( \ n ).

ПРИМЕЧАНИЕ 2: для этого требуются GNU xargs и GNU mv . Вы используете Linux, поэтому они стандартные.

Вы можете изменить номера (50 и 1000) и базовый каталог в соответствии с вашими потребностями.

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

Если все файлы, которые вы хотите переместить, соответствуют определенному шаблону, вы можете использовать параметры find -name или -regex , чтобы выбрать их. добавьте опции сразу после -типа f . например если вы хотите переместить только файлы .txt :

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

Версия, отличная от GNU, не может использовать mv -t . он также не может использовать параметр xargs -d , но вы можете использовать tr '\ n' '\ 0' для преобразования новой строки в символы NUL для ввода в xargs -0r - опять же, это справляется с любым файлом, у которого нет \ n в имени файла. -R -1 не является posix, это расширение freebsd для xargs , вы можете безопасно удалить этот параметр, но операция mv будет выполняться намного медленнее.

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done
0
19.04.2018, 19:16
0 ответов

Теги

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