Переместить ряд пронумерованных файлов?

Переместить ряд пронумерованных файлов?

У меня есть 291 пронумерованный файл (начинающийся с 001 - заголовок и заканчивающийся 291 - заголовок), которые нужно переместить в отдельные каталоги. (001 - 021 в папку 1, 022 - 053 в папку 2, это не обязательно одинаковое количество файлов каждый раз).

Я подумал, что могу сделать это вот так, отвратительно:ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

Я почти уверен, что есть лучший способ. Так какой же это будет?

EDIT: Это бы все отлично сработало, но я вспомнил...

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

решение1

Поскольку вы сказали, что не всегда ровно 21 файл, вам нужно переместить файлы вручную, и чтобы сделать это эффективно, вы можете использоватьрасширение скобки:

mv filename{001..21} dir1
mv filename{022..53} dir2
...

решение2

Это переместит файлы, как вы описали (за исключением того, что второй диапазон будет от 022 до 042 для вторых 21 файла).

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

решение3

Я имею в виду, что при перемещении большого количества файлов (десятков тысяч или миллиона) оболочка будет жаловаться на слишком длинный список файлов, если вы просто используете {1..20}, поэтому

Взш, вы можете загрузитьмввстроенный:

setopt extended_glob zmodload

zsh/файлы

После этого вы можете использовать команду типа:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

или если вы пишете скрипты оболочки, вы можете сделать что-то вроде этого:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

если вы не используете zsh, вы можете обратиться кhttps://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long

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