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
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?
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
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.
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.
Esqueci-me do gnu parallel
!
ls -d -- */ | parallel "cd {} && mv ./__test__/index.js ./data.js 2>/dev/null"
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