Cómo replicar y aplanar los nombres de subdirectorios anidados profundos en una nueva carpeta

Cómo replicar y aplanar los nombres de subdirectorios anidados profundos en una nueva carpeta

Ejemplo, tengo el directorio de entrada de la siguiente manera con dos ramas en el segundo nivel (2 y 22)

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

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

Quiero ejecutar un comando para completar ~/output_directorycon un subdirectorio de un solo nivel configurado para contener subdirectorios (vacíos) con esos nombres, por lo que el subdirectorio único bajo directorio_salida simplemente se aplana como

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

El directorio_entrada original no se modifica.


Usando

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

rendimientos

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

Pensé que esto funcionaría:

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

pero lamentablemente no (con o sin -max Depth que puse allí por si acaso).

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

se ejecuta correctamente, ¿ya casi está ahí?

Agradecido por la ayuda.

Respuesta1

No estoy seguro de si eso es lo que quieres porque no entendí claramente por qué quieres eso, pero puedes intentar esto.

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

Ahora intenta ejecutar esto:

 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

Respuesta2

De la gran respuesta de Danila, esta es mi versión 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;

Respuesta3

Puede usar basenamepara tomar simplemente la última parte de la ruta encontrada por find, generar los resultados separados por valores nulos y usar xargscon replace-str( -I) para agregar el nombre base al directorio de salida.

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

información relacionada