在文件夹序列中添加一个文件夹并重命名其他文件夹

在文件夹序列中添加一个文件夹并重命名其他文件夹

我有 x 个文件夹

folder1
folder2
folder3
......
folder100

我想做的是;

add folder2
reorder

所以现在:

folder1
folder2
folder3
......
folder101

所以现在,文件夹 2 的文件夹是文件夹 3,依此类推。

示例:文件夹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 中执行此操作?

答案1

您可以使用for..带有大括号表达式的子句进行枚举以及内联算术;像这样的东西:

for f in {100..2} ; do mv $f $((f+1)) ; done

这将负责将所有文件夹从 100 个一步“上移”到 2 个。

更一般地说,您可以使用一个脚本,从文件夹名称模式 X_1 中发现插入点 X,以及“打孔”之前的最大编号文件夹名称。像这样的东西:

#!/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))意思是“加1的值f”。

该脚本不处理超过最高数字的“插入”。

答案2

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/  

答案3

将正则表达式与 mkdir 一起使用:

mkdir folder{1..100}

然后验证你的输出!

ls -l 

folder1
folder2
folder3
..
folder100

答案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

这是非常手动的,但可以更快地解决最初的问题。

相关内容