我有 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
这是非常手动的,但可以更快地解决最初的问题。