深くネストされたサブディレクトリの名前を複製して新しいフォルダにフラット化する方法

深くネストされたサブディレクトリの名前を複製して新しいフォルダにフラット化する方法

例 2番目のレベルに2つのブランチ(2と22)を持つ次の入力ディレクトリがあります。

~/input_directory/1/2/3/4/5/6

~/input_directory/1/22/3/4/5/6

これらの名前の(空の)サブディレクトリを含むように設定された単一レベルのサブディレクトリを作成するコマンドを実行したいので~/output_directory、output_directoryの下の単一のサブディレクトリは次のように単純にフラット化されます。

  ./1   ./2 ./22  ./3  ./4  ./5  ./6

元の input_directory は変更されません。


使用

find . -type d -exec echo {} \; 

収穫

./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/22
./1/22/3
./1/22/3/4
./1/22/3/4/5
./1/22/3/4/5/6

私はこれがうまくいくと思いました:

find . -type d -maxdepth 10 -print0 | xargs -0 mkdir -p  ~/output_folder

しかし、残念ながらそうではありません (念のため -maxdepth を指定しても指定しなくても)。

find . -type d -maxdepth 10 -print0 | xargs -0 ls -al  

正しく実行されるので、ほぼ完了ですか?

援助に感謝します。

答え1

なぜそれが必要なのかよくわからなかったので、それがあなたが望んでいることかどうかはわかりませんが、これを試すことができます

  [user@host ~]$ ls 1
2  22
  [user@host ~]$ ls -R 1
1:
2  22

1/2:
3

1/2/3:
4

1/2/3/4:
5

1/2/3/4/5:
6

1/2/3/4/5/6:

1/22:
3

1/22/3:
4

1/22/3/4:
5

1/22/3/4/5:
6

1/22/3/4/5/6:

では、これを実行してみてください:

 mkdir output_directory; find 1 -type d -exec echo {} \; > dirs.txt; for dir in $(cat dirs.txt); do if [ ! -d  output_directory/${dir##*/} ]; then mkdir output_directory/${dir##*/}; fi; done;

[user@host ~]$  ls output_directory/
1  2  22  3  4  5  6

答え2

Danila さんの素晴らしい回答をもとに、これが私の最終版です。

find . -type d -exec echo {} \; > /tmp/tempdirs.txt; \
for dir in $(cat /tmp/tempdirs.txt); do \
  if [ ! -d ~/output_directory/${dir##*/} ]; then \
    mkdir -p ~/output_directory/${dir##*/}; \
  fi; \
done;

答え3

basenameを使用して、によって検出されたパスの最後の部分のみを取得しfind、結果を nul 区切りで出力し、( )xargsとともに使用して、出力ディレクトリにベース名を追加することができます。replace-str-I

find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}

関連情報