私はここで狂っています。このようなフォルダがたくさんあります。
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`