11

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

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

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

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

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

3 ответа3

22

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

mv filename{001..21} dir1
mv filename{022..53} dir2
...
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
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, вы можете обратиться к https://unix.stackexchange.com/questions/128559/solving-mv-argument-list-too-long

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .