Как скопировать и объединить имена глубоко вложенных подкаталогов в новую папку

Как скопировать и объединить имена глубоко вложенных подкаталогов в новую папку

Пример. У меня есть входной каталог с двумя ветвями на 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

Из замечательного ответа Данилы, это моя окончательная версия.

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, вывести результаты, разделенные нулем, и использовать xargswith replace-str( -I), чтобы добавить базовое имя в выходной каталог.

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

Связанный контент