Добавьте папку в последовательность папок и переименуйте другие папки.

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

0
23.09.2017, 21:45
4 ответа

Я решил это так

#!/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

Это делается вручную, но быстрее решает исходную проблему.

-1
28.01.2020, 04:39

С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/  
0
28.01.2020, 04:39

Вы можете использовать предложение 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».

Сценарий не обрабатывает «вставить» после наибольшего числа.

1
28.01.2020, 04:39

Использовать регулярное выражение с mkdir:

mkdir folder{1..100}

Тогда проверьте результат!

ls -l 

folder1
folder2
folder3
..
folder100
0
28.01.2020, 04:39

Теги

Похожие вопросы