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


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.