Рекурсивное перемещение файлов и папок в Linux

75

Рассмотреть возможность:

ls -al ../public-back
drwxrwxr-x  4 apache   apache     4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x  2 apache   apache    4096 Apr 19 03:33 content
drwxrwxr-x  2 apache   apache   20480 Apr 20 06:14 images
drwxrwxr-x  2 apache   apache    4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x  4 apache   apache     4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 content
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 images
drwxrwxr-x  2 apache   apache    4096 Apr 20 09:50 video

Как я могу переместить содержимое /public-back/templatesрекурсивно с разрешениями в /public/templates?

siliconpi
источник
mv ../public-back/templates/* public / templates /
mv -R ../public-back/templates/* public/templates/Я все еще проголосовал бы, чтобы переместить вопрос.
2
mv: неверный параметр - R @Vladislav Zorov
3
я сделал cp -a ../public-back/templates/ public /

Ответы:

92

Если я не понимаю вопрос, это будет работать:

mv /public-back/templates/* /public/templates

Кроме того, если у вас нет огромного списка файлов, добавление -iбудет запрашивать, прежде чем что-либо перезаписать, что добавляет некоторую безопасность при использовании подстановочных знаков, подобных *.

DQdlM
источник
14
Это не перемещает скрытые файлы.
Арда
2
Смотрите askubuntu.com/a/259386/358964 для настройки dotglob, чтобы скрытые файлы также перемещались.
mkobit
3
Примечание. Это не приведет к перезаписи файлов в подкаталогах. Вы получите Directory not emptyсообщение.
Армстронг
Кажется, что это сгладило иерархию каталогов. Не сохранить папки в исходной папке для меня. Все файлы оказались в одной папке, вместо того, чтобы буквально перемещать исходную папку с одинаковой структурой.
Роберт Ноак
Это решение работает, но если вы видите эту ошибку: mv: target '/public/templates' is not a directoryпросто создать папку вручную mkdir /public/templates.
Али Шабдар
8

Страница man для cp гласит:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Пытаться;

cp -rp /public-back/templates/* /public/templates/
Himalay
источник
13
mvдля перемещения , а cpдля копирования - семантическое / этимологическое различие.
Мариус Бутук
cpэто намного медленнее, чем mv. cpпринуждает компьютер копировать все с диска в оперативную память, а затем снова записывать его на диск, что может занять много времени в зависимости от размера файлов. Однако mvвсегда происходит мгновенно, потому что нужно переписать только ссылки.
tjespe
4

При перемещении элементов с моего флеш-накопителя на мою систему OSMC я нашел следующее очень полезным:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Объяснение того, как это работает, ниже.

Кстати, не забудьте добавить обратную косую черту перед любыми пробелами в именах каталогов источника или назначения (см. Выше).

find  finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec     Executes a command, in our case mv

-v        Verbose, so you can see what's happening (optional)

{}        is replaced by the name of the found object.

По сути, вы находите все файлы и все папки и перемещаете их одну за другой (или, если каталог был найден первым, вы перемещаете этот каталог и его содержимое). Это запускает новый процесс для каждого хода и очень неэффективно. Используйте это только когда обычные команды терпят неудачу.

Пи Хард
источник
2

М.В., кажется, не делает этого. Но вы можете использовать этот маленький трюк, работает как шарм:

tar cf - . |(cd /targetdir; tar xvf -)

и сохраняет разрешения и все.

Примечание: ничего из вышеперечисленного не помогло мне, вот почему это обходной путь.

svye
источник
1
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Поэтому создайте жесткие ссылки в каталоге назначения и удалите исходный каталог. 'mv' просто не будет работать в вашем случае, и в целом работает только тогда, когда source dir и dest не имеют общих поддеревьев.

Обратите внимание, что я предполагаю, что слово 'move' в вопросе означает, что источник dir должен быть удален после операции.

Boudewijn
источник