私はここで狂っています。このようなフォルダがたくさんあります。
Folder 1/
Subfolder 2/
Item.01
Item.02
Subfolder 3/
Item.01
Item.02
フォルダ1内のすべてのファイル名を再帰的に順次変更したいのですが、現在の階層(表示されているように)に従い、ls
フラット構造(単一フォルダ内のすべてのファイル)に移動します。
例:
Folder 1/
Item 01
Item 02
Item 03 (previously Item 01 on Subfolder 2)
Item 04 (previously Item 02 on Subfolder 2)
Item 05 (previously Item 01 on Subfolder 3)
bashでこれは可能ですか?とても感謝しています!
答え1
globstar
次のオプションがどのように役立つかをご覧くださいbash
。shopt -s globstar ; for i in ** ; do echo "$i" ; done
これにより、ディレクトリツリー内のすべてのエントリのソートされたリストが提供されますが、これにはファイルとサブディレクトリのエントリ(行)が含まれます。
サブディレクトリをフィルタリングします。
shopt -s globstar ; for i in ** ; do [ -f " $i" ] && echo "$i" ; done
カウンタを導入し、現在のファイルサフィックスを削除します。
cnt=1 shopt -s globstar for i in ** ; do [ -f "$i" ] && echo "${i%%.*}.$cnt" cnt=$((cnt=cnt+1)) done
テストステートメントを必要なもの
echo
に置き換えます。mv
mv "$i" "${i%%.*}.$cnt"
(オプション)
globstar
完了したら、このオプションをオフにします。`shopt +s globstar`
答え2
以下を使用する方が簡単ですzsh
。
autoload zmv # best in ~/.zshrc
cd "Folder 1"
n=0; zmv -n '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
(満足している場合は削除してください-n
(ドライランの場合))。
<->
:任意の10進数シーケンス(<x-y>
無制限)(#qn)
:数値ソートに使用されます(Subfolder 10
だから後ろにSubfolder 2
)。^/
: ファイル形式の除外目次。${(l:2::0:)var}
:左パディング(大きい場合は切り捨て)、sの長さは2$var
です0
。
警告注:globは、空の**/
レベルを含むすべてのレベルのサブディレクトリと一致するように設計されており、現在のディレクトリのファイルと一致しますが、一度はzmv
globに、2番目は単純パスとして2回パターンに渡されるため、そうではありません。キャプチャグループを抽出するためのパターンマッチング(その後、ミスのために**/Item
2番目にパターンマッチング/
)。
解決策は以下を使用することです。
zmv -n '(**/)Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
または:
zmv -wn '**/Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
ただし、zmv
それが再帰一致であることを検出し、深さ優先順位をオンにします(ディレクトリ名を安全に変更できるように)。現在のディレクトリのファイルを深さ優先ソートと一致させたくない場合は、長い形式の**/
()を使用できます。(*/)#
zmv -n '(*/)#Item.<->(#qn^/)' 'Item ${(l:2::0:)$((++n))}'
はい
存在する:
.
├── Subfolder 1
│ ├── Item.01
│ ├── Item.02
│ └── Subsubfolder
│ └── Item.01
├── Subfolder 10
│ ├── Item.01
│ └── Item.02
└── Subfolder 2
├── Item.01
└── Item.02
それは以下を提供します:
mv -- Subfolder\ 1/Item.01 Item\ 01
mv -- Subfolder\ 1/Item.02 Item\ 02
mv -- Subfolder\ 1/Subsubfolder/Item.01 Item\ 03
mv -- Subfolder\ 2/Item.01 Item\ 04
mv -- Subfolder\ 2/Item.02 Item\ 05
mv -- Subfolder\ 10/Item.01 Item\ 06
mv -- Subfolder\ 10/Item.02 Item\ 07