Estoy buscando alguna forma de organizar los archivos contenidos en el directorio b
para 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 mv
comando con salida de los comandos awk
o/y sed
, como se muestra en las siguientes imágenes.
Directorios modelo antes como Errors a
y 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 c
antes 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 c
debería ser igual al directorio a
sin copiar a
el 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 b
que 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 b
para que coincidan con a
la jerarquía de sin copiar nada de a
a 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 find
proceso para cada archivo en a
):
- busca todos los archivos normales en
a
, - define un directorio de destino como el directorio principal del archivo y
a
se reemplaza porb
, - crea el directorio de destino (
makedir -p
no se queja de los directorios ya existentes y también crea todos los padres necesarios), - busca todos los archivos con
b
el mismo nombre que el actual y los mueve al directorio de destino;mv -i
pregunta antes de sobrescribir, para evitar perder datos si dos archivos en subdirectorios distintosb
tienen el mismo nombre.
Es posible que desee eliminar archivos o directorios normales b
(como d3
en 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