Решения, которые используют *
(расширенный оболочкой), не будут работать со слишком многими объектами в /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/
чтобы иметь права не по умолчанию, владение и т.д.