перемещение файлов и папок в подпапку

перемещение файлов и папок в подпапку

Я хотел бы переместить все файлы и папки из одного каталога в одну из его подпапок. Как это сделать?

Я использую BusyBox и Linux.

бывший:

переместить все файлы и папки /my/path/в/my/path/subfolder/.

Решения типа «копировать, а затем удалить» не по карману.

Спасибо.

решение1

mv * subfolder 

Конечно, переместить каталог «подпапка» в себя не получится, но все остальное переместится

решение2

Решения, использующие *(расширенные оболочкой), не будут работать со слишком большим количеством объектов в /my/path/. В таком случае вы получите:

argument list too long

В этом подходе не используются *:

cd /my/path/ &&
find . -mindepth 1 -maxdepth 1 ! -name subfolder -exec mv -t subfolder/ {} +

К сожалению, параметры -mindepthи несовместимы с POSIX; я думаю, что ни один из параметров несовместим с POSIX.-maxdepthfind-tmv

Этот вариант должен соответствовать 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/вы хотите иметь нестандартные разрешения, права собственности и т. д.

решение3

Самый простой способ сделать это:

mv !(subfolder) subfolder

«!» означает НЕТ, аналогично языкам программирования, где mv переместит все файлы и папки в требуемую подпапку, за исключением самой подпапки.

Дополнительные функции, такие как перемещение скрытых папок и папок-точек, описаны здесь:https://askubuntu.com/questions/91740/how-to-move-all-files-in-current-folder-to-subfolder

решение4

Вы можете проверить mvкоманду. Вы можете попробовать выполнить поиск всех файлов и папок в каталоге и исключить подкаталог, а затем скопировать все найденное в этот подкаталог, используя findкоманду mv.

См. аналогичный вопрос на stack-overflowhttps://stackoverflow.com/questions/4612157/how-to-use-mv-command-to-move-files-except-those-in-a-specific-directory

Связанный контент