Como replicar e nivelar os nomes dos subdiretórios aninhados em uma nova pasta

2

Exemplo Eu tenho o diretório de entrada da seguinte maneira com duas ramificações no 2º nível (2 e 22)

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

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

Eu quero executar um comando para preencher ~/output_directory com um subdiretório de nível único definido para conter subdiretórios (vazios) com esses nomes, portanto, o único subdiretório em output_directory é simplesmente nivelado como

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

O input_directory original não foi alterado.

Usando

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

rendimentos

./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

Eu achei que isso funcionaria:

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

mas infelizmente não (com ou sem o -maxdepth que eu coloquei lá apenas no caso).

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

executa corretamente, então está quase lá?

Grato pela ajuda.

    
por Richard L 22.03.2018 / 19:44

3 respostas

1

Da grande resposta de Danila, esta é a minha versão final.

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;
    
por 22.03.2018 / 20:43
2

Não tenho certeza se é isso que você quer, pois eu não entendi claramente por que você quer isso, mas você pode tentar isso

  [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:

Agora, tente executar isso:

 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
    
por 22.03.2018 / 20:30
0

Você pode usar basename para pegar a última parte do caminho conforme encontrado por find , exibindo os resultados separados por nul e usar xargs com replace-str ( -I ) para anexar o nome da base no diretório de saída.

find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}
    
por 22.03.2018 / 20:33