Directory

在一系列文件夾中添加一個文件夾並重命名其他文件夾

  • November 4, 2019

我有 x 個文件夾

folder1
folder2
folder3
......
folder100

我想做的是;

add folder2
reorder

所以現在:

folder1
folder2
folder3
......
folder101

所以現在,文件夾 2 的文件夾是文件夾 3,等等。

範例:文件夾 2 -> 文件夾 3、文件夾 3 -> 文件夾 4、文件夾 4 -> 文件夾 5

folder1 保持不變。

更準確地說,我想自動化這個

$ 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 中做到這一點?

您可以使用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))表示“f加 1 的值”。

該腳本不處理超過最高數字的“插入”。

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/  

引用自:https://unix.stackexchange.com/questions/393302