
У меня есть 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