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に1つの手順で「上に移動」できます。
より一般的には、フォルダ名パターン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
これは非常に受動的ですが、初期の問題をはるかに迅速に解決できます。