Решения, которые используют * (расширенный оболочкой), не будут работать со слишком многими объектами в /my/path/ . В таком случае вы получите:
argument list too long
Этот подход не использует *:
cd /my/path/ &&
find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +
К сожалению, -mindepth и -maxdepth опции find не совместимы с POSIX; я думаю, что нет -t вариант mv .
Этот вариант должен удовлетворять POSIX:
cd /my/path/ &&
find . ! -name . -prune ! -name subfolder -exec mv {} subfolder/ \;
(Я адаптировал этот ответ Unix & Linux SE). К сожалению, он вызывает mv для каждого найденного объекта, поэтому он медленный.
Быстрый альтернативный подход, если только вы можете создавать каталоги заново (изначально не должно существовать ни /my/path/subfolder/ ни /my/subfolder/ ):
- переименовать
path/ в subfolder/ ,
- воссоздать
path/ ,
- переместить
subfolder/ в path/ .
Обратите внимание на файловую систему, основанную на inode, это должно быть одинаково быстро, независимо от того, сколько объектов в path/ . Код:
cd /my/ &&
test ! -e subfolder/ && mv path/ subfolder/ &&
mkdir path/ &&
mv subfolder/ path/
В этом случае я много использовал && чтобы подчеркнуть, что процедура должна прерваться, если какой-либо из ее шагов завершится неудачей. Однако такой подход неудобен, если вам нужен path/ или subfolder/ чтобы иметь права не по умолчанию, владение и т.д.