ファイル名を再帰的かつ逐次的に変更するには?

ファイル名を再帰的かつ逐次的に変更するには?

私はここで狂っています。このようなフォルダがたくさんあります。

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

  1. globstar次のオプションがどのように役立つかをご覧くださいbash

    shopt -s globstar ; for i in ** ; do echo "$i" ; done
    

    これにより、ディレクトリツリー内のすべてのエントリのソートされたリストが提供されますが、これにはファイルとサブディレクトリのエントリ(行)が含まれます。

  2. サブディレクトリをフィルタリングします。

    shopt -s globstar ; for i in ** ; do [ -f " $i" ] && echo "$i" ; done
    
  3. カウンタを導入し、現在のファイルサフィックスを削除します。

    cnt=1
    shopt -s globstar
    for i in ** ; do
      [ -f "$i" ] && echo "${i%%.*}.$cnt"
      cnt=$((cnt=cnt+1))
    done
    
  4. テストステートメントを必要なものechoに置き換えます。mv

    mv "$i" "${i%%.*}.$cnt"
    
  5. (オプション)globstar完了したら、このオプションをオフにします。

    `shopt +s globstar`
    

おすすめ記事