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


13

У мене 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 папку в папці 1 і 22 папки в папці 2?
Даніель Бек

Ви переглянули unix.SE? Тут є хороша нитка: unix.stackexchange.com/questions/12976/…
chrisjlee

@DanielBeck ні, я хочу, щоб файли переміщувалися до кожної папки. У кожну папку збирається різна кількість файлів.
Роб

@ ChrisJ.Lee Це дуже схоже на те, що я робив / робив раніше, мені це подобається. Оскільки файли відповідають іншим файлам в іншій папці, я міг ls -l | grep ^- | wc -lотримати числа рядків.
Роб

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

Відповіді:


24

Оскільки ви сказали, що це не завжди точно 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 extension_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


Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. Яку відповідь ви називаєте "більш детальною відповіддю"?
Рамхаунд

Це насправді не відповідає на питання, оскільки ОП хоче перенести різні файли в різні каталоги.
DavidPostill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.