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.