Копирование скрытых файлов 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 (возможно в вашем дистрибутиве иная папка).

Читайте также:  Astra linux работа с флешкой

А если в директории-источнике нет файлов, то 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

Читайте также:  При загрузке windows появляется синий экран с надписью

), потом прописал следующее:
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 / сохраняя природу, разрешения и расширенные атрибуты.

Источник

Читайте также:  Прописать загрузку windows 10 через командную строку

Как скопировать скрытые (начиная с точки) файлы и подкаталоги в 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), и это сработало.

Источник

Оцените статью