Mover a estrutura de pastas em vários diretórios [duplicado]

4

Estou tentando mover um monte de arquivos de uma só vez, um diretório para cima.

Isso é o que eu tentei, mas não funcionou:

mv ./*/__test__/index.js ./*/data.js

.
├── alpha
│   ├── __test__
│   │   └── index.js
│   ├── index.js
│   └── test.js
└── beta
    ├── __test__
    │   └── index.js
    ├── index.js
    └── test.js

Para isso:

.
├── alpha
│   ├── data.js
│   ├── index.js
│   └── test.js
└── beta
    ├── data.js
    ├── index.js
    └── test.js

Como posso fazer isso no unix?

    
por ThomasReggi 23.03.2018 / 20:21

5 respostas

4

Você não pode usar curingas no argumento de destino. Então, pelo menos, alguns scripts são necessários:

for d in *; do
    if [[ -d "$d" ]]; then
        pushd "$d"
        mv __test__/index.js ./data.js
        popd
    fi
done
    
por 23.03.2018 / 20:32
2

Aqui está um exemplo que irá mover os arquivos.

for f in $(find -name index.js | grep __test__ ); do echo $f; destination=$(echo $f | awk 'BEGIN{FS="/"} {print $2}'); mv ${f} ./$destination/data.js; done

Eu testei isso, ele faz o movimento como esperado.

    
por 23.03.2018 / 20:35
2
find . -path '*/__test__/*' -type f -name "index.js" \ 
    -execdir echo mv -vt ../data.js {} \;

Remova echo , que é para execução a seco, para executar o comando mv nos arquivos.

    
por 23.03.2018 / 21:18
1

Esqueci-me do gnu parallel !

ls -d -- */ | parallel "cd {} && mv ./__test__/index.js ./data.js 2>/dev/null"
    
por 23.03.2018 / 20:38
1

Remova echo s para a mudança real.

for i in */__test__/index.js; do
    echo mv -v "$i" "${i%%/*}/data.js"
    echo rm -vr "${i%/*}"
done

Antes

.
├── alpha
│   ├── index.js
│   ├── __test__
│   │   └── index.js
│   └── test.js
└── beta
    ├── index.js
    ├── __test__
    │   └── index.js
    └── test.js

Depois de

.
├── alpha
│   ├── data.js
│   ├── index.js
│   └── test.js
└── beta
    ├── data.js
    ├── index.js
    └── test.js
    
por 23.03.2018 / 21:46

Tags