次の構造を持つ大規模なnレベルディレクトリがあります。
root
|
subdir1
|
sub_subdir1
|
....(n-2 levels).....
|
file1
|
subdir2
|
sub_subdir2
|
....(n-2 levels).....
|
file2
すべてのレベル1になるようにディレクトリを平坦化したいと思います。サブディレクトリ含む文書。また、レベル2を(n-1)で削除したいです。サブサブディレクトリファイルが含まれていないためです。サブディレクトリの名前はすべて異なります。
希望する結果
root
|
subdir1
|
file1
|
subdir2
|
file2
方法を説明する投稿がたくさん見つかりました。単調にするディレクトリにありますが、制御された方法でこれを行う方法については説明しません。
- 平坦化するレベルを指定して
- または、ルートディレクトリのすべてのサブディレクトリに対してこの操作を繰り返し実行します。
答え1
zshを使う:
cd /root
for subdir in subdir*
do
mv "$subdir"/**/*(.) "$subdir"
rm -r "$subdir"/*(/)
done
これ:
- "/root"ディレクトリを変更します(あなたの例では)
- 名前付きの各サブディレクトリを繰り返します
subdir*
(例:subdir1とsubdir1の一致)。 - このサブディレクトリ内の一致する(予想されるがすべて一致する)ファイルをこのサブディレクトリに移動します。これはzshの
**
再帰的なglobing機能を使用し、glob修飾子に限定されます。*(.)
つまり、このディレクトリのすべてのエントリは通常のファイルです。 - ファイルを移動したら、そのサブディレクトリの下にある各サブディレクトリを繰り返し削除します。これは
*(/)
、一致するディレクトリエントリを表すzsh glob修飾子を再利用します。
答え2
Bashで、次の操作を行います。
shopt -s dotglob
for d in root/*/
do
find "$d" -type f -exec mv -i -t "$d" {} +
find "$d" -mindepth 1 -type d -delete
done
root
ドットファイルを含む ""内のすべての内容を調べます。ドットファイルを見る必要がない場合は無視してくださいshopt -s dotglob
。警告:追加しないでください。.*
またはコマンド。root/.*
for
/
Jeffが提案したように、最後のglob()はサブディレクトリのみを提供するので、すべてのサブディレクトリをテストする必要はありません(たとえば、を使用して)。root/*/
if
すべてサブディレクトリで、root
そのサブディレクトリとその下のすべてのファイルを見つけて、そのサブディレクトリに移動します。ファイルが上書きされるのを防ぐために使用されます(たとえば、Distributedという名前のファイルが-i
複数ある場合)。 「対話型」を意味し、既存のファイルを上書きする必要があるかどうかを尋ねます。参考にしてくださいfile1
subdir1
-i
可能「はい」と答えても、これを拒否してください。あなたのバージョンが mv
このオプションをサポートしていない場合は、-t
コマンドをmv
次のように置き換えてください。
find "$d" -type f -exec mv -i {} "$d" ';'
次に、最上位のサブディレクトリの下のすべてのサブディレクトリを削除します。find
ファイルが移動されていない場合、これ(...)は失敗します。-delete
この部分はインスピレーションを受けて作られています。デロベルの答え 到着 入れ子になったディレクトリの平坦化。