As soluções que usam *
(expandido por shell) não funcionarão com muitos objetos em /my/path/
. Nesse caso, você terá:
argument list too long
Esta abordagem não usa *
:
cd /my/path/ &&
find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +
Infelizmente, as opções -mindepth
e -maxdepth
de find
não são compatíveis com POSIX; Nem -t
opção de mv
é, eu acho.
Esta variante deve satisfazer o POSIX:
cd /my/path/ &&
find . ! -name . -prune ! -name subfolder -exec mv {} subfolder/ \;
(Eu adaptei esta resposta Unix e Linux SE ). Infelizmente, ele chama mv
para cada objeto encontrado, portanto, é lento.
Abordagem alternativa rápida, se você puder criar diretórios novamente (inicialmente não deve existir /my/path/subfolder/
nem /my/subfolder/
):
- renomear
path/
para subfolder/
,
- recriar
path/
,
- mova
subfolder/
para path/
.
Nota sobre o sistema de arquivos baseado em inode, isto deve ser igualmente rápido, não importa quantos objetos existam em path/
. O código:
cd /my/ &&
test ! -e subfolder/ && mv path/ subfolder/ &&
mkdir path/ &&
mv subfolder/ path/
Neste caso eu usei muito &&
para enfatizar que o procedimento deve ser abortado se algum dos seus passos falhar. No entanto, essa abordagem é inconveniente se você precisar de path/
ou subfolder/
para ter permissões não padrão, propriedade etc.