Estou procurando uma maneira de organizar os arquivos contidos em directory b
para tornar sua estrutura igual à de directory a
(que contém os mesmos arquivos que b
, apenas organizados de maneira diferente), sem copiar ou mover nada de directory a
. Dessa forma busque algum uso avançado de mv
comando com saída de comandos awk
ou/e sed
, conforme imagens a seguir.
Diretórios de modelo antes como Errors a
e sem modificações, 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
Diretórios de conteúdo Errors c
antes e depois, conforme desejado, 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
Dessa forma, o diretório c
deve se tornar igual ao diretório a
sem copiar a
o conteúdo do diretório.
Responder1
encontrar, sed, xargs, mkdir:
find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}
Responder2
Supondo, para simplificar, que seus dados originais estejam no diretório a
:
a
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4
e que você tem um diretório b
que contém os mesmos arquivos que a
, organizado como uma estrutura de diretório diferente:
b
├── d1
│ └── f3
├── d2
│ ├── f1
│ └── f2
└── d3
└── f4
Para reorganizar os arquivos b
para corresponder a
à hierarquia sem copiar nada de a
para 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 não é realmente eficiente (gera um novo find
processo para cada arquivo a
):
- procura todos os arquivos regulares em
a
, - define um diretório de destino como o diretório pai do arquivo,
a
substituído porb
, - cria o diretório de destino (
makedir -p
não reclama dos diretórios já existentes e também cria todos os pais necessários), - procura todos os arquivos
b
nomeados como o atual e os move para o diretório de destino;mv -i
pergunta antes de substituir, para evitar a perda de dados se dois arquivos em subdiretórios distintosb
tiverem o mesmo nome.
Você pode então querer remover arquivos ou diretórios regulares b
(como d3
em nosso exemplo) que não estão em a
:
export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
target=$orig${1#$dest}
[ ! -e "$target" ]
' mysh {} \; -delete
O resultado final é:
b
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4