次のフォルダ構造があります。
├── foo1
│ ├── bar1.txt
│ └── bar2.txt
├── foo2
│ ├── bar3.txt
│ └── bar4 with a space.txt
└── foo3
└── qux1
├── bar5.txt
└── bar6.txt
各フォルダレベルの間にアンダースコアを使用して平坦化したいと思います。
├── foo1_bar1.txt
├── foo1_bar2.txt
├── foo2_bar3.txt
├── foo2_bar4 with a space.txt
├── foo3_qux1.bar6.txt
└── foo3_qux1_bar5.txt
周りを見回しましたが、うまくいく解決策が見つかりませんでした。主に私の問題には2つの特徴があるからです。ルートフォルダ内に複数のフォルダレベルがあり、一部のファイルに空白がある可能性があります。
Bashでこれを達成する方法を知っていますか?ありがとうございます!
編集する:Glenn Jackmanが提案した答えを実行すると、次のような結果が得られます。
最初のレベルのフォルダには2つのアンダースコアがあります。これを避ける方法や名前を変更して下線で表示する方法を知っていますか?ありがとうございます。
ベストアンサー1
find */ -type f -exec bash -c 'file=${1#./}; echo mv "$file" "${file//\//_}"' _ '{}' \;
echo
仕事に満足したら削除してください。 echoコマンドが引用符を表示しないことを心配しないでください。スクリプトはスペースを含むファイルを正しく処理します。
現在空のサブディレクトリを削除するには、次の手順を実行します。
find */ -depth -type d -exec echo rmdir '{}' \;