Organice los archivos del directorio by sus subdirectorios igual que el directorio a sin copiar ni mover del directorio a

Organice los archivos del directorio by sus subdirectorios igual que el directorio a sin copiar ni mover del directorio a

Estoy buscando alguna forma de organizar los archivos contenidos en el directorio bpara que su estructura sea igual a la del directorio a(que contiene los mismos archivos que b, pero organizados de manera diferente), sin copiar ni mover nada del directorio a. De esa manera, busque un uso avanzado del mvcomando con salida de los comandos awko/y sed, como se muestra en las siguientes imágenes.

Directorios modelo antes como Errors ay sin modificaciones, como Errors b:

.                                       .
└── Errors a                            └── Errors b
    ├── Eltendorf                           ├── Eltendorf
    │   ├── 2013 March 09.txt               │   ├── 2013 March 09.txt
    │   ├── 2014 November 07.txt            │   ├── 2014 November 07.txt
    │   ├── 2016 August 03.txt              │   ├── 2016 August 03.txt
    │   └── 2017 October 02.txt             │   └── 2017 October 02.txt
    ├── Gettendorf                          ├── Gettendorf
    │   ├── 2011 August 05.txt              │   ├── 2011 August 05.txt
    │   ├── 2014 October 02.txt             │   ├── 2014 October 02.txt
    │   ├── 2014 October 09.txt             │   ├── 2014 October 09.txt
    │   └── 2015 November 08.txt            │   └── 2015 November 08.txt
    ├── Krensdorf                           ├── Krensdorf
    │   ├── 2010 August 04.txt              │   ├── 2010 August 04.txt
    │   ├── 2010 November 04.txt            │   ├── 2010 November 04.txt
    │   └── 2012 August 09.txt              │   └── 2012 August 09.txt
    └── Ritzing                             └── Ritzing
        ├── 2013 March 01.txt                   ├── 2013 March 01.txt
        ├── 2013 March 02.txt                   ├── 2013 March 02.txt
        ├── 2013 March 03.txt                   ├── 2013 March 03.txt
        └── 2018 November 02.txt                └── 2018 November 02.txt

Directorios de contenidos Errors cantes y después, según se desee, como Errors d:

.                                       .
└── Errors c                            └── Errors d
    ├── Eltendorf                           ├── Eltendorf
    │   ├── 2010 November 04.txt            │   ├── 2013 March 09.txt
    │   ├── 2013 March 02.txt               │   ├── 2014 November 07.txt
    │   ├── 2014 November 07.txt            │   ├── 2016 August 03.txt
    │   └── 2014 October 09.txt             │   └── 2017 October 02.txt
    ├── Gettendorf                          ├── Gettendorf
    │   ├── 2012 August 09.txt              │   ├── 2011 August 05.txt
    │   ├── 2013 March 03.txt               │   ├── 2014 October 02.txt
    │   ├── 2014 October 02.txt             │   ├── 2014 October 09.txt
    │   └── 2017 October 02.txt             │   └── 2015 November 08.txt
    ├── Krensdorf                           ├── Krensdorf
    │   ├── 2010 August 04.txt              │   ├── 2010 August 04.txt
    │   ├── 2013 March 01.txt               │   ├── 2010 November 04.txt
    │   ├── 2015 November 08.txt            │   └── 2012 August 09.txt
    │   └── 2018 November 02.txt            └── Ritzing
    └── Ritzing                                 ├── 2013 March 01.txt
        ├── 2011 August 05.txt                  ├── 2013 March 02.txt
        ├── 2013 March 09.txt                   ├── 2013 March 03.txt
        └── 2016 August 03.txt                  └── 2018 November 02.txt

De esa manera, el directorio cdebería ser igual al directorio asin copiar ael contenido del directorio.

Respuesta1

buscar, sed, xargs, mkdir:

find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}

Respuesta2

Suponiendo, por simplicidad, que sus datos originales están en el directorio a:

a
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

y que tiene un directorio bque contiene los mismos archivos que a, organizados en una estructura de directorio diferente:

b
├── d1
│   └── f3
├── d2
│   ├── f1
│   └── f2
└── d3
    └── f4

Para reorganizar los archivos bpara que coincidan con ala jerarquía de sin copiar nada de aa b:

export orig=a dest=b
find "$orig" -type f -exec sh -c '
    for file; do
        target=$dest${file#$orig}
        target=${target%/*}
        mkdir -p -- "$target"
        find "$dest" -type f -name "${file##*/}" \
            -exec mv -i -- \{\} "$target/" \;
    done
    ' mysh {} +

Este código no es realmente eficiente (genera un nuevo findproceso para cada archivo en a):

  • busca todos los archivos normales en a,
  • define un directorio de destino como el directorio principal del archivo y ase reemplaza por b,
  • crea el directorio de destino ( makedir -pno se queja de los directorios ya existentes y también crea todos los padres necesarios),
  • busca todos los archivos con bel mismo nombre que el actual y los mueve al directorio de destino; mv -ipregunta antes de sobrescribir, para evitar perder datos si dos archivos en subdirectorios distintos btienen el mismo nombre.

Es posible que desee eliminar archivos o directorios normales b(como d3en nuestro ejemplo) que no están en a:

export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
    target=$orig${1#$dest}
    [ ! -e "$target" ]
    ' mysh {} \; -delete

El resultado final es:

b
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

información relacionada