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

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

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

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`
    

答え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は、空の**/レベルを含むすべてのレベルのサブディレクトリと一致するように設計されており、現在のディレクトリのファイルと一致しますが、一度はzmvglobに、2番目は単純パスとして2回パターンに渡されるため、そうではありません。キャプチャグループを抽出するためのパターンマッチング(その後、ミスのために**/Item2番目にパターンマッチング/)。

解決策は以下を使用することです。

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

関連情報