Organize os arquivos do diretório be seus subdiretórios iguais ao diretório a sem copiar ou mover do diretório a

Organize os arquivos do diretório be seus subdiretórios iguais ao diretório a sem copiar ou mover do diretório a

Estou procurando uma maneira de organizar os arquivos contidos em directory bpara 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 mvcomando com saída de comandos awkou/e sed, conforme imagens a seguir.

Diretórios de modelo antes como Errors ae 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 cantes 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 cdeve se tornar igual ao diretório asem copiar ao 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 bque 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 bpara corresponder aà hierarquia sem copiar nada de apara 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 findprocesso para cada arquivo a):

  • procura todos os arquivos regulares em a,
  • define um diretório de destino como o diretório pai do arquivo, asubstituído por b,
  • cria o diretório de destino ( makedir -pnão reclama dos diretórios já existentes e também cria todos os pais necessários),
  • procura todos os arquivos bnomeados como o atual e os move para o diretório de destino; mv -ipergunta antes de substituir, para evitar a perda de dados se dois arquivos em subdiretórios distintos btiverem o mesmo nome.

Você pode então querer remover arquivos ou diretórios regulares b(como d3em 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

informação relacionada