2011-04-20 10:24:10 +0000 2011-04-20 10:24:10 +0000
79
79

Перемещать файлы и папки рекурсивно под Linux

Рассмотрим:

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)

97
97
97
2011-04-20 14:10:36 +0000

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

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

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

10
10
10
2011-04-20 14:24:07 +0000

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

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

Попробуйте;

cp -rp /public-back/templates/* /public/templates/
5
5
5
2016-02-17 07:43:21 +0000

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

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

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

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

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
2
2
2017-09-06 07:05:14 +0000
cp -a --link ../public-back/* /public/. && rm -rf ../public-back

Итак, создайте жесткие ссылки в целевом каталоге и удалите исходный каталог. ‘mv’ просто не будет работать в вашем случае, и вообще работает только тогда, когда исходный и целевой каталоги не имеют общих поддеревьев.

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

2
2
2
2015-10-20 15:24:37 +0000

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

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

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

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

Похожие вопросы

6
10
7
5
9