63

Рассматривать:

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?

5 ответов5

80

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

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

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

7

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

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

Пытаться;

cp -rp /public-back/templates/* /public/templates/
3

При перемещении элементов с моего флеш-накопителя на систему 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 -)

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

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

0
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .