Как рекурсивно переместить пакеты 20 файлов в пронумерованные папки от папки 1 000 файлов

Как насчет:

# ... getopts processing ...

[[ $1 = "--" ]] && shift
exeparams=("$@")

Отметьте, необходимо использовать массив для содержания параметров. Это правильно обработает любые аргументы, содержащие пробел. Разыменуйте массив с "${exeparams[@]}"

1
28.08.2017, 18:58
2 ответа

Этот сценарий берет два (дополнительно) аргументы, каталог к разделу и parition размер. Так как Вы не сказали, хотите ли Вы только переместить файлы или переместить все, я предположил, что Вы имели в виду файлы, таким образом, я использовал команду находки.

Несколько комментариев,

  • Разве Вы не указали оболочку, что-то вроде этого более легко сделано в жемчуге, рубине или Python.
  • найдите с maxdepth 1, делает только каталог
  • можно переместить файлы куда угодно, просто изменить именование папки
  • так как находка используется, можно добавить - имя,-mtime,-ctime, и т.д.

Copysome.sh,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

Вот сценарий для тестирования с (у меня не было дополнительных 1000 файлами, лежащими вокруг),

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done
2
27.01.2020, 23:39

Только одного цикла forдолжно быть достаточно, когда ваше имя файла заканчивается соответствующими цифрами, но оболочка zsh.

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Если в bash, то:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Обучающий пост:Как я могу использовать $variable в раскрытии скобок оболочки последовательности?

0
27.01.2020, 23:39

Теги

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