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


14

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

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

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

РЕДАКТИРОВАТЬ: Так что это работало бы хорошо, но я вспомнил ...

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


1
Вы хотите 21 подпапки в папке 1 и 22 папки в папке 2?
— Даниэль Бек

Вы просматривали unix.SE? Здесь есть хорошая тема: unix.stackexchange.com/questions/12976/…
— chrisjlee

@DanielBeck нет, я хочу, чтобы файлы перемещались в каждую папку. В каждую папку попадает разное количество файлов.
— Роб

@ ChrisJ.Lee Это очень похоже на то, что я делал / делал раньше, мне это нравится. Поскольку файлы соответствуют другим файлам в другой папке, я мог ls -l | grep ^- | wc -lбы получить количество строк.
— Роб

1
@Rob Верно. Тем не менее, разное количество файлов в каждом каталоге. Автоматизация этого (включая правила) требует больше усилий, чем несколько раз.
— Даниэль Бек

Ответы:


25

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

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

Похоже, это может сработать, я попробую.
— Роб

1
Это работает отлично, если вы добавите подстановочные знаки после скобок. Это именно то, что мне было нужно.
— Роб

2
Если номер находится в середине имени, вы можете написать file{001..21}name, вам не нужно использовать подстановочный знак. В любом случае, рад, что это сработало для вас.
— drrlvn

1

Это переместит файлы, как вы описали (за исключением того, что второй диапазон будет от 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

Это не всегда 21 файл, но спасибо.
— Роб

0

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

В zsh вы можете загрузить встроенную mv :

setopt extended_glob zmodload

ЗШ / файлы

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

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

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

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

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


Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. На какой ответ вы ссылаетесь как на «более подробный ответ»?
— Ramhound

Это на самом деле не отвечает на этот вопрос, так как OP хочет переместить разные файлы в разные каталоги.
— ДэвидПостилл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.