Se foldername for igual a “somestring”, mova todos os arquivos na pasta um nível acima

1

Devido a um antigo conceito de backup, eu tenho alguns discos rígidos aqui, que contêm estruturas de arquivos como:

/1.1
/2.1
/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/1.1
/FOLDER.DUPLICATE.$DRIVEBENDER/3.1
/FOLDER.DUPLICATE.$DRIVEBENDER/4.1
/Subfolder/1.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/2.2
/Subfolder/FOLDER.DUPLICATE.$DRIVEBENDER/3.2

O resultado deve ser igual à estrutura original, então todos os arquivos em uma pasta chamada FOLDER.DUPLICATE.$DRIVEBENDER devem ser movidos um nível acima. Se o arquivo um nível acima existir, o arquivo maior deve ganhar.

    
por nico 10.09.2017 / 16:11

2 respostas

0

Supondo que você não tem FOLDER.DUPLICATE.$DRIVEBENDER diretórios dentro de outros diretórios FOLDER.DUPLICATE.$DRIVEBENDER , você pode fazer algo como:

find . -path '*/FOLDER.DUPLICATE.$DRIVEBENDER/*' -prune -type f -print0 |
  perl -0lne '
    if (m{(.*)/FOLDER.DUPLICATE.\$DRIVEBENDER/(.*)}s) {
      $upperfile = "$1/$2";
      if (-s > -s $upperfile) {
        rename $_, $upperfile or warn "rename $_: $!\n";
      } else {
        unlink $_ or warn "unlink $_: $!\n";
      }
    }'

(se o seu find não suportar -print0 , você pode substituir por -exec printf '%s%code%' {} + ).

    
por 11.09.2017 / 17:28
0

Você pode fazer algo parecido com o comando da seguinte forma (testado no sucesso do ambiente).

find ./ -path '*/FOLDER.DUPLICATE.$DRIVEBENDER/*' -type f -execdir sh -c ' 
    if [ "$(stat -c %s -- "$0")" -ge "$(stat -c %s -- "../${0##*/}" || echo 1)" ]; then
        echo mv -v "$0" "../";
    fi 
' '{}' \;

Diretórios / Arquivos estrutura antes do comando ser executado: por favor note que os números entre parênteses [...] são arquivos / diretórios tamanho em byte.

$ tree --du
.
├── [ 4]  1.1
├── [ 8]  2.1 
├── [12]  3.1
├── [55]  FOLDER.DUPLICATE.$DRIVEBENDER 
│   ├── [ 3]  1.1
│   ├── [36]  3.1
│   └── [16]  4.1 
└── [40]  Subfolder 
    ├── [16]  1.2 
    └── [24]  FOLDER.DUPLICATE.$DRIVEBENDER
        ├── [ 8]  2.2
        └── [16]  3.2

         119 bytes used in 3 directories, 9 files

Diretórios / Arquivos estrutura após o comando executado:

$ tree --du
.
├── [ 4]  1.1
├── [ 8]  2.1 
├── [36]  3.1
├── [16]  4.1
├── [ 3]  FOLDER.DUPLICATE.$DRIVEBENDER
│   └── [ 3]  1.1
└── [40]  Subfolder
    ├── [16]  1.2
    ├── [ 8]  2.2
    ├── [16]  3.2
    └── [ 0]  FOLDER.DUPLICATE.$DRIVEBENDER

         107 bytes used in 3 directories, 8 files
    
por 10.09.2017 / 16:45

Tags