У меня есть x количество папок
folder1
folder2
folder3
......
folder100
Я хочу сделать следующее:
add folder2
reorder
Итак, теперь:
folder1
folder2
folder3
......
folder101
Итак, папка, которая была folder2, - это folder3 и т. д.
Пример: папка2 -> папка3, папка3 -> папка4, папка4 -> папка5
Папка1 остается без изменений.
Чтобы быть более точным, я хочу автоматизировать это
$ mkdir 1 2 3 4 5
$ ls
1 2 3 4 5
$ mkdir 2_1
$ ls
1 2 2_1 3 4 5
$ mv 5 6
$ ls
1 2 2_1 3 4 6
$ mv 4 5
$ mv 3 4
$ mv 2 3
$ mv 2_1 2
$ ls
1 2 3 4 5 6
$
Как мне это сделать в bash?
Я решил это так
#!/bin/bash
for f in {100..2} ; do mv $f $((f+1)); done
x="?_1"
y=$(echo $x | cut -b 1-1)
mv $x $y
Это делается вручную, но быстрее решает исходную проблему.
Сzsh
:
autoload zmv # best in ~/.zshrc
zmv 'folder(<2->)(#q/nOn)' 'folder$(($1 + 1))' &&
mkdir folder2
Или для вашего автоматического переименования на основе наличия folder<n>_1
папок:
setopt extendedglob
for dir ([-._[:alpha:]]##<->_1(N/nOn)) {
[[ $dir = (#b)(*)(<->)_1 ]]
zmv "($match[1])(<$match[2]->)(#q/nOn)" '$1$(($2 + 1))' &&
mv "$dir" "${dir%_1}" || break
}
Пример:
до:
$ ls
bar1/ bar2/ bar2_1/ bar3/ foo1/ foo1_1/ foo1_3/ foo2/ foo3/ foo4/
после:
$ ls
bar1/ bar2/ bar3/ bar4/ foo1/ foo2/ foo3/ foo4/ foo5/ foo6/
Вы можете использовать предложение for..
с фигурными скобками для перечисления плюс встроенные арифметические операции; что-то вроде этого:
for f in {100..2} ; do mv $f $((f+1)) ; done
Это позаботится о перемещении «вверх» всех папок со 100 до 2 на один шаг.
В более общем смысле вы можете использовать сценарий, который обнаруживает точку вставки X из шаблона имени папки X _1 и имя папки с наибольшим номером перед «проделыванием отверстия». Что-то вроде этого:
#!/bin/bash
X=*_1
F=( $(ls * | sort -nr) )
for f in {$F..${X%_1}} ; do mv $f $((f+1)) ; done
mv $X ${X%_1}
Обратите внимание, что $F
— это массив всех имен папок, численно отсортированных от наибольшего к наименьшему числу, поэтому $F
само по себе является наибольшим числом. Кроме того, формат ${X%_1}
означает «$X
с удаленным окончанием _1
». Формат $((f+1))
означает «значение f
плюс 1».
Сценарий не обрабатывает «вставить» после наибольшего числа.
Использовать регулярное выражение с mkdir:
mkdir folder{1..100}
Тогда проверьте результат!
ls -l
folder1
folder2
folder3
..
folder100