- Как скопировать скрытые (начиная с точки) файлы и подкаталоги в linux?
- 5 ответов 5
- Команда cp: правильное копирование папок с файлами в *nix
- Выводы
- Послесловие
- linux-notes.org
- Как скопировать скрытые файлы в Linux
- 2 thoughts on “ Как скопировать скрытые файлы в Linux ”
- Добавить комментарий Отменить ответ
- Рекурсивное копирование скрытых файлов — Linux
- Как скопировать скрытые (начиная с точки) файлы и подкаталоги в linux?
Как скопировать скрытые (начиная с точки) файлы и подкаталоги в linux?
Как скопировать скрытые файлы и скрытые подкаталоги (начиная с точки) в папке A в папку B? Например, если у меня есть эта структура:
Я хотел бы скопировать в B только скрытые файлы и скрытые подкаталоги в A:
Я уже пробовал эту команду: cp A/.* B из этого другого вопроса суперпользователя. Тем не менее, он не копирует подкаталоги. Также попробовал cp -r A/.* B , но он копирует . поэтому я заканчиваю точной копией A (включая обычные файлы). Любая помощь приветствуется.
5 ответов 5
Пока вы ищете только скрытые файлы и папки на уровне A и не хотите, например,
чтобы быть скопированным, вы должны быть в состоянии использовать это:
Это в основном означает копировать все, что начинается с . а затем любой символ, кроме . Это отфильтровывает . и ..
Редактировать: удалил -p из команды cp, так как Аскер не указал, что хочет сохранить права собственности, даты и т.д.
Проблема с A/.* том, что есть каталог . в A который также соответствует шаблону.
Вы можете включить расширенные шаблоны глобусов и использовать следующее:
Он соответствует файлам, имя которых начинается с точки, а второй символ не является ни точкой, ни ничем (?(.) Ничего не соответствует или точка,! (. ) отрицает его, т.е.! (?(.)) Соответствует всему остальному чем ничего или точка).
Для таких случаев рекомендуется использовать find вместо cp :
Основной синтаксис разбивается следующим образом: find элементы в каталоге A/ , тип которых является файлом (а не каталогом), и сделайте это для maxdepth из 1 каталогов и чье name начинается с . , И как только эти файлы будут найдены, exec команду cp с флагом -p чтобы сохранить дату / время от источника ( <> ) до места назначения B/ .
Мне нравится использовать maxdepth для добавления слоя управления, поэтому я не случайно копирую целую файловую систему. Но не стесняйтесь удалить это.
- find A -type d предоставляет рекурсивный список в A только с каталогами
- grep -E «\.» фильтрует каталоги с точкой (т.е. скрытые каталоги)
- здесь была нужна опция -E, потому что без нее она также означает «текущий каталог»
- обратный слеш должен избегать значения в регулярном выражении слова «любой символ»
- cp -r для рекурсивного копирования
Я создал структуру файлов и папок для A и выполнил команду в Git Bash (у меня сейчас нет Linux), и это сработало.
Источник
Команда cp: правильное копирование папок с файлами в *nix
В этой статье будут раскрыты некоторые неочевидные вещи связанные с использованием wildcards при копировании, неоднозначное поведение команды cp при копировании, а также способы позволяющие корректно копировать огромное количество файлов без пропусков и вылетов.
Допустим нам нужно скопировать всё из папки /source в папку /target.
Первое, что приходит на ум это:
Сразу исправим эту команду на:
Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r .
После копирования мы обнаружим, что скопировались не все файлы — были проигнорированы файлы начинающиеся с точки типа:
.profile
.local
.mc
и тому подобные.
Почему же так произошло?
Потому что wildcards обрабатывает shell ( bash в типовом случае). По умолчанию bash проигнорирует все файлы начинающиеся с точек, так как трактует их как скрытые. Чтобы избежать такого поведения нам придётся изменить поведение bash с помощью команды:
Чтобы это изменение поведения сохранилось после перезагрузки, можно сделать файл wildcard.sh c этой командой в папке /etc/profile.d (возможно в вашем дистрибутиве иная папка).
А если в директории-источнике нет файлов, то shell не сможет ничего подставить вместо звёздочки, и также копирование завершится с ошибкой. Против подобной ситуации есть опции failglob и nullglob . Нам потребуется выставить failglob , которая не даст команде выполниться. nullglob не подойдёт, так как она строку с wildcards не нашедшими совпадения преобразует в пустую строку (нулевой длины), что для cp вызовет ошибку.
Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:
На длину командной строки есть ограничение, которое мы можем узнать используя команду:
Получим максимальную длину командной строки в байтах:
Получим что-то типа:
Итак, давайте будем обходиться вовсе без wildcards.
Давайте просто напишем
И тут мы столкнёмся с неоднозначностью поведения cp . Если папки /target не существует, то мы получим то, что нам нужно.
Однако, если папка target существует, то файлы будут скопированы в папку /target/source.
Не всегда мы можем удалить заранее папку /target, так как в ней могут быть нужные нам файлы и наша цель, допустим, дополнить файлы в /target файлами из /source.
Если бы папки источника и приёмника назывались одинаково, например, мы копировали бы из /source в /home/source, то можно было бы использовать команду:
И после копирования файлы в /home/source оказались бы дополненными файлами из /source.
Такая вот логическая задачка: мы можем дополнить файлы в директории-приёмнике, если папки называются одинаково, но если они отличаются, то папка-исходник будет помещена внутрь приёмника. Как скопировать файлы из /source в /target с помощью cp без wildcards?
Чтобы обойти это вредное ограничение мы используем неочевидное решение:
Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки «.» и «..», являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.
- При копировании cp проверяет существование и пытается создать /target/.
- Такая директория существует и это есть /target
- Файлы из /source скопированы в /target корректно.
Итак, вешаем в жирную рамочку в своей памяти или на стене:
Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе.
Выводы
Если нужно скопировать все файлы из одной папки в другую, не используем wildcards, вместо них лучше использовать cp в сочетании с точкой в конце папки-источника. Это скопирует все файлы, включая скрытые и не завалится при миллионах файлов или полном отсутствии файлов.
Послесловие
vmspike предложил аналогичный по результату вариант команды:
ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:
Источник
linux-notes.org
Как скопировать скрытые файлы в Linux
Есть простой способ рекурсивно скопировать все файлы включают скрытые файлы в каталога в другой каталог? Использование Rsync команды является лучшим решением для этого.
-a: Архивный Режим
-v: Подробный режим
—progress: Показать прогресс в процессе передачи.
Другим решением, вы также можете использовать команду «cp» и рисунок матчей, введите следующую команду:
Так же можно использовать команду:
Так же можете использовать:
Тема «Как скопировать скрытые файлы в Linux’ подошла к завершению, но если есть вопросы, то пишите мне их.
2 thoughts on “ Как скопировать скрытые файлы в Linux ”
Долго бился над этой проблемой, но обновился до Ubuntu 17.10, дай, думаю, скопирую, получилось так:
cp -rp /home/potapov/ /mnt/disk2/
результат — каталог /potapov/ целиком скопирован в каталог /disk2/, что мне нужно не было. Удалил rm -rf /mnt/disk2/* ; rm -rf /mnt/disk2/.*, т.к. rm не хочет удалять содержимое каталога вместе со скрытыми файлами. Вероятно, нужно сделать каталог активным и можно сделать rm -rf . и все удалиться.
Чтобы скопировать содержимое potapov/ мне пришлось сделать этот каталог активным (cd
), потом прописал следующее:
cp -rp . /mnt/disk2/ — и вуаля, содержимое potapov переезжает в /mnt/disk2 вместе со всеми скрытыми файлами и каталогами (имя которых начинается на точку «.»).
Сравнение их размеров все же показало незначительное отличие, почему так, пока не выяснил.
# du -s
# du -s /mnt/disk2
87720 /mnt/disk2
И последнее, копирование каталога активного пользователя у меня не получилось, т.к. в нем есть кэш файлы, которыми пользуется оболочка и не дает их скопировать. Пришлось выйти в рут и копировать соблюдая наследование прав, чтобы все файлы из home не скопировались с правами root.
Теперь моя задача заставить Ubuntu подумать, что точка монтирования home на другом блочном устройстве. К сожалению описание home с его текущей точкой монтирования изъята из файла /etc/fstab, где искать — ума не приложу.
Если в /etc/fstab нет /home то он не примонтирован, а просто существует там же, где и root. Добавляете /home в fstab, потом делаете перезагрузку
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Источник
Рекурсивное копирование скрытых файлов — Linux
Есть ли простой способ рекурсивного копирования всех скрытых файлов в каталоге в другой каталог? Я хотел бы сделать резервную копию только всех файлов настроек в домашнем каталоге, а не обычных файлов. Я старался:
но он распознает . и .. и рекурсивно копирует все не скрытые файлы тоже. Есть ли способ заставить cp игнорировать . и .. ?
Моим любимым ходом режиссеров вообще было:
который подключает текущий каталог к стандартному выводу, а затем направляет его в подоболочку, которая сначала переписывает компакт-диск в конечный каталог перед тем, как распаковать стандартный ввод. Простой, прямой, расширяемый — подумайте, что происходит, когда вы заменяете () ssh на другой компьютер. Или, чтобы ответить на ваш вопрос, вы можете сделать:
Почти каждый раз, когда это можно решить просто с помощью:
Довольно необычно иметь скрытый файл, который не начинается с одного из этих символов.
Другие сопоставления с образцами доступны ( . * , .[^.]* ) — см. Комментарии
Вы могли бы использовать rsync .
который скопирует содержимое текущего каталога (включая точечные файлы, но не включая .. )
Я умоляю вас, шаг от простого расширения оболочки в cp командной строке — оболочка расширение имеет все виды гм . «Интересных» угловые случаи (нежелательных рекурсию , вызванные и . пробела, непечатаемые вещи, жесткие ссылки, символические ссылки, и и т. д.) Используйте find вместо этого (он входит в findutils пакет, если он у вас не установлен — что было бы странно, все дистрибутивы устанавливают его по умолчанию):
- -H приведет к тому, что find не будет следовать символическим ссылкам (кроме случаев, когда фактическое имя каталога верхнего уровня, которое вы дали, является символической ссылкой; это будет следовать.)
- /path/to/toplevel/dir/ Очевидно, что он должен быть заменен вами путем к каталогу, в котором находятся файлы настроек и каталоги, резервные копии которых вы хотите создать.
- -maxdepth 1 остановит find рекурсивный спуск в любые каталоги, имя которых начинается с точки. Нам не нужно это повторять, cp мы сделаем это за нас, нам просто нужны имена на этом уровне.
- -name ‘.*’ говорит, find что мы хотим, чтобы все имена начинались с точки. Это не будет работать правильно, если установлена переменная окружения POSIXLY_CORRECT , но редко (если вообще когда-либо). Это первое условие соответствия, которое мы указали до сих пор.
- a \( . \) является и сопровождается более сложным условием в скобках (я использовал . для его замены, это объяснено ниже.) Нам нужно избегать скобок, так как иначе они будут (неправильно) интерпретироваться оболочкой, отсюда и обратный слеш перед ними,
- -type d -o -type f -o -type l три условия с или между ними. -type d сопоставляет каталоги, -type f сопоставляет обычные файлы и -type l сопоставляет символические ссылки. Вы можете выбрать то, что вы хотите — например, если вы не хотите делать резервные копии каталогов настроек, опустите -type d ( -o очевидно, и справа за ним).
- -exec . \; говорит find выполнить команду каждый раз, когда встречается совпадение. Конец команды отмечен точкой с запятой, которую мы снова должны экранировать обратной косой чертой, чтобы избежать интерпретации оболочки. В этой командной строке вам нужно использовать, <> где вы хотите, чтобы имя встречающегося в данный момент совпадения заканчивалось. Так как оболочки могут также неверно истолковывать фигурные скобки, вы должны поместить их в апострофы, как в ‘<>‘ . В этом случае мы хотим выполнить команду cp -a ‘<>‘ /path/to/destination/dir/ (-a означает архив, который повторяется в подкаталогах, копирует символические ссылки в виде ссылок и сохраняет разрешения и расширенные атрибуты и /path/to/destination/dir/ , очевидно, является именем целевого каталога — замените его.)
Итак, на простом английском языке эта find командная строка говорит следующее:
Начните с / path / to / toplevel / dir /. Не спускайтесь ни в какие подкаталоги. Найти все каталоги, файлы и символические ссылки, чье имя начинается с точки. Для каждого из найденных объектов скопируйте его в / path / to / destination / dir / сохраняя природу, разрешения и расширенные атрибуты.
Источник
Как скопировать скрытые (начиная с точки) файлы и подкаталоги в linux?
Как скопировать скрытые файлы и скрытые подкаталоги (начиная с точки) в папке A в папку B? Например, если у меня есть эта структура:
Я хотел бы скопировать в B только скрытые файлы и скрытые подкаталоги в A:
Я уже попробовал эту команду: cp A/.* B из этого другого вопроса суперпользователя . Тем не менее, он не копирует подкаталоги. Также пытался cp -r A/.* B , но он копирует, . поэтому я заканчиваю с точной копией A (включая обычные файлы). Любая помощь приветствуется.
Пока вы ищете только скрытые файлы и папки на уровне A и не хотите, например,
чтобы быть скопированным, вы должны быть в состоянии использовать это:
Это в основном означает копирование всего, что начинается с, . а затем любого символа, кроме того, . который отфильтровывает . и ..
Редактировать: удалил -p из команды cp, так как Аскер не указал, что хочет сохранить права собственности, даты и т. Д.
Проблема в A/.* том, что существует каталог, . в A котором также соответствует шаблону.
Вы можете включить расширенные шаблоны глобусов и использовать следующее:
Он соответствует файлам, имя которых начинается с точки, а второй символ не является ни точкой, ни ничем (? (.) Ничего не соответствует или точка,! (. ) отрицает его, т.е.! (? (.)) Соответствует всему остальному чем ничто или точка).
Для таких случаев рекомендуется использовать find вместо cp этого:
Основной синтаксис разбивается следующим образом:
- find A/ -type f : find элементы в каталоге A/ , тип которых является файлом (вместо каталога)…
- -maxdepth 1 -name ‘.*’ : Для этого maxdepth из 1 каталогов и чей name начинается с . .
- -exec cp -p <> B/ \; И как только эти файлы найдены, команда с флагом для сохранения даты / времени из источника ( ) до пункта назначения . exec cp -p <> B/
Мне нравится использовать, maxdepth чтобы добавить слой контроля, поэтому я не случайно копирую целую файловую систему. Но не стесняйтесь удалить это.
- find A -type d предоставляет рекурсивный список в пределах А только с каталогами
- grep -E «\.» фильтрует каталоги с точкой (т.е. скрытые каталоги)
- здесь нужна опция -E, потому что без нее она также означает «текущий каталог»
- обратный слеш должен избегать значения в регулярном выражении «любого символа»
- cp -r копировать рекурсивно
Я создал структуру файлов и папок для A и выполнил команду в Git Bash (у меня сейчас нет Linux), и это сработало.
Источник