Directory
在一系列文件夾中添加一個文件夾並重命名其他文件夾
我有 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/