Linux cp скрытые файлы

Обновлено: 05.07.2024

Разбираю работу команд оболочки bash по работе с файлами и каталогами в Ubuntu 16.04.1.

Если использую команду удаления rm, то всё логично:

rm * - удаляет все файлы, кроме "файлов с точкой".
rm .* - удаляет все "файлы с точкой".

Аналогично с переносом mv и с удалением каталогов rmdir.

Но вот с копированием cp фигня какая-то.
Если копировать файлы, то всё работает аналогично, но вот если каталоги.

cp -r * dir - копирует все файлы и каталоги, кроме "файлов с точкой", НО! содержимое копируемых каталогов копируется полностью - и с точками и без точек.
Ну может так оно и логично.

А вот если засандалить точку со звёздочкой, то тут вообще ересь какая-то получается.
cp -r .* dir - во-1, в целевой каталог копируются все каталоги и файлы из текущего каталога (с точками и без), во-2, кроме файлов и каталогов из текущего каталога в целевой каталог копируются файлы и каталоги находящиеся в каталоге на один уровень выше текущего (родительском), НО не копируется родительский каталог текущего.


Так и должно быть?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

SOCKS сервер для принятия данных с браузера. Что означают команды "GET", "POST"
Нужно сделать socks сервер. Создал TCP сервер, принимаю все данные с браузера. Вот только перед.


Есть ещё команды в python для создания текста кроме команды ui.lineEdit.setText("")?
Я пишу свой калькулятор но при тестировании кнопок я заметил что команда ui.lineEdit.setText("Любое.


Создать ярлык для быстрого отображение/скрытия "скрытых папок"
Подскажите, пожалуйста. Нужно создать ярлык (или быструю кнопку во вкладках**), чтобы при вызове.

Если ты запустишь команду ls -la, то увидишь, что есть в директории такие ссылки с названиями . и ..
Почитай про них.
И аккуратней с точками.

Т.е. получается, что команда cp -r работает с дескрипторами текущего и родительского каталогов как с обычными каталогами?
В отличии от mv?

И там и там задаю отбор по .*, а результат совершенно разный!

Проверил в CentOS - аналогично.

Первые авторы утилит разные, остальные двое одинаковые.

Т.е. получается, что команда cp -r работает с дескрипторами текущего и родительского каталогов как с обычными каталогами? Это не от команд должно зависеть, wildcard'ы шелл интерпретирует. И там и там задаю отбор по .*, а результат совершенно разный! Это не от команд должно зависеть, wildcard'ы шелл интерпретирует.

С моими кривыми ручками так не получается. Т.е. шаблоны одинаковые, а результаты разные. В разных системах.

Это ответы команд. Правильно? У меня пока сложно с правильной терминологией. Тут вопросов нет - всё так.

А результаты для mv .* и cp -r .*. Ессно они должны быть разные - перенос и копирование. ) Поскольку в целевой директории должен быть одинаковый результат, поэтому сравниваю эти команды.

А результат в целевом каталоге у меня разный получается.

Не знаю как из виртуалбокса копипастить, поэтому дам скрины.

siffok, Кончайте страдать ерундой. Вам уже порекомендовали про В приведенном примере кроме самих команд надо еще учитывать где именно Вы находитесь. Неужели непонятно что скопировать каталог в котором Вы находитесь не составляет проблем, то переместить его «выдернув из-под себя» не получится? Что-то не так?
Разбираю азы и наталкиваюсь на непонятку: гляжу в учебники - ноль без палочки, читаю мануал - никаких ремарок.
Знаете - подскажите, нет - спокойно пройдите мимо.
Вам уже порекомендовали проВ приведенном примере кроме самих команд надо еще учитывать где именно Вы находитесь. Неужели непонятно что скопировать каталог в котором Вы находитесь не составляет проблем, то переместить его «выдернув из-под себя» не получится?

Внимательно и спокойно прочтите мой вопрос. К переносу претензий нет - команда mv по шаблону .* переносит только файлы и каталоги с точкой из указанного каталога, как и другие команды по работе с объектами файловой системы - файлами и каталогами (за ссылки ещё не брался). Аналогично с шаблоном *.

Так же всё отлично работает при копировании командой cp без ключа -r. Т.е. шаблон "звезда с точкой" - и файлы только с точкой копируются, шаблон "звезда" - копируются только "видимые" файлы.
Но стоит добавить ключ -r, как шаблон "звезда с точкой" начинает обрабатывать дескриптор родительского каталога как каталог (по моим предположениям) и в целевой каталог копируются (никто ничего не выдёргивает не из под кого) файлы и каталоги из родительского.

Вот для чистоты эксперимента провёл все манипуляции "свыше" - ничего не изменилось, т.е. тащит содержимое родительского

Провёл ещё несколько опытов увеличив глубину - не буду засорять скринами - аналогично.

Вывод для себя сделал: Если пользоваться командой cp -r с шаблоном .* - надо готовиться к сюрпризам!


ЗЫ Может кто в контакте с разработчиками: хотелось бы узнать -это фича, баг или мои кривые руки? )

Как я могу сделать все это в одной команде без сопоставления с образцом? Какой флаг мне нужно использовать?

Пожалуйста, Eleven81, рассмотрите возможность изменения принятого ответа на ответ, заданный @bruno pereira, потому что он избегает создания новой папки. Если нет, то пусть этот комментарий будет предупреждением для новых читателей, чтобы проверить также другой (наиболее проголосовавший) ответ. Tx.

Не указывайте файлы:

(Обратите внимание, что он /home/user не должен уже существовать, иначе он будет создан /home/user/skel .)

Можно ли использовать нечто подобное, если /home/user/skel оно существует? @ bradley.ayers Я думаю, что можно скопировать во временный подкаталог, а затем переместить их на верхний уровень (так как перемещение на одном диске происходит быстро). Менее чем идеал, но короче, чем другие решения для меня. @ bradley.ayers Ответ Бруно, приведенный ниже, отвечает на ваш вопрос Это решение не сработало для меня. Он не копировал скрытые файлы. Я использую CentOS релиз 6.5. Решение @ Бруно сработало. В Ubuntu / Debian это помещает каталог 'skel' в целевой каталог, а не рекурсивные файлы внутри skel. Используйте -T (без цели) ниже для правильного использования. ( -rT для

Допустим, вы создали новую папку (или собираетесь ее создать) и хотите скопировать в нее файлы после ее создания.

Это позволит рекурсивно скопировать все файлы / папки из /etc/skel уже существующей папки, созданной в первой строке.

Если я не понял неправильно, это не скопировало скрытые / точечные файлы. Хорошо работает для меня. Обратите внимание, что "." имеет решающее значение для его работы. Это работает, но почему? Не могу найти ссылку на это в руководстве. Я думаю, что это работает, потому что обычно это создает новую папку с именем последней папки в первом аргументе. Однако, так как это имя . , это поведение потребует от него создания уже существующего каталога, поэтому он просто пропускает этот шаг. @Technext По умолчанию глобализация в bash не включает имена файлов, начинающиеся с a . , чтобы изменить то, что вам нужно использовать shopt -s dotglob команду перед тем, как включать эти файлы. Таким образом * , по умолчанию вы запрашиваете рекурсивное копирование всех файлов из этого каталога, который можно расширить с помощью * (который по умолчанию не содержит скрытых файлов). В то время как на другом конце . вы используете cp для рекурсивного копирования всего из «этого каталога».

Правильный способ сделать это - использовать эту -T (--no-target-directory) опцию и рекурсивно копировать папки (без конечных слешей, звездочек и т. Д.), То есть:

Это скопирует содержимое /etc/skel в /home/user (включая скрытые файлы), создав папку, /home/user если она не существует; однако эта -T опция предотвращает /etc/skel копирование содержимого в новую папку, /home/user/skel если папка /home/user существует.

это ЛУЧШИЙ ответ из группы; это единственный, который решает проблему, не усложняя ее Очень нравится, когда вы используете правильный флаг cmd для одного случая.

bash сама имеет хорошее решение, оно имеет shell option , Вы можете cp , mv и так далее .:

Выше решение является стандартом bash

НОТА:

Это полезно, когда вы хотите скопировать только содержимое, не создавая новый каталог в месте назначения. Особенно, когда пункт назначения является точкой монтирования. Это действительно лучший ответ, и он доходит до сути вопроса .. Это setopt для Zsh, на случай, если кому-то еще интересно.

rsync -rtv source_folder/ destination_folder/

Лучший вариант для меня, хотя я использую --progress, чтобы получить больше отзывов обо всем процессе.

rsync это хорошо, но другой выбор:

Из основной справки:

Я всегда использовал cp -r. Спасибо за упоминание cp -a

Если ваш исходный и целевой каталог имеют одно и то же имя, даже если целевой каталог существует, вы можете просто набрать:

Это скопирует каталог / etc / skel в / home /, включая скрытые файлы и каталоги.

В конце концов, вы можете скопировать каталог и переименовать его в одну строку:

Или вы можете просто использовать cp -r /etc/skel /home/user для переименования skel в user . Это верно, только если / home / user еще не существует.

Вы можете использовать rsync.

Вы даже можете скопировать через SSH

Выражение * включает все файлы и каталоги (также начинающиеся с точки).

Если вы не хотите использовать вышеприведенное выражение, вы можете использовать cp свойство, которое позволяет указывать несколько источников для одной целевой папки:

@DJCrashdummy, к сожалению, я не понимаю, почему вы написали свое внимание. В конце концов, мое решение учитывает случаи, о которых вы пишете. С уважением извините неправильный текст! - проблема с вашим ответом в том, что он также будет учитывать . и .. (что эквивалентно текущей и содержащей ее папке). || но все же ответ в ссылке объясняет это дальше и предоставляет решение.

Обратите внимание, что есть хитрость командной строки (работает, по крайней мере, в sh , bash и ksh ): просто добавьте суффикс к каталогу from . Это выльет содержимое каталога from в каталог to (по иронии судьбы я впервые узнал об этом приеме при использовании rsync ).

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

Я попробовал трюк с косой чертой, но это не сработало для меня.

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

yes предназначен для автоматической перезаписи файлов назначения, r рекурсивного, v многословного, p сохранения разрешений.

Обратите внимание, что исходный путь не заканчивается на / (поэтому все файлы / каталог и. Файлы скопированы)

Каталог назначения заканчивается тем, / что мы помещаем содержимое исходной папки в место назначения в целом.

Я видел, что cp не всегда копирует скрытые файлы, и если вам нужна команда, которая работает на всех диалектах Linux / Unix, вы должны попробовать использовать:

Начиная как минимум с K3b 2.0.3, при добавлении каталога в проект появляется окно вопроса, в котором спрашивается, хотите ли вы включить скрытые файлы . также появляется вопрос, который нужно задать о включении ссылки. Хорошие вещи!


Команда cp в Linux

что_копируем — файл, несколько файлов, директория или несколько директорий, которые необходимо скопировать.

куда_копируем — название файла, в который выполняется копирование другого файла, или директория, в которую копируются исходные файлы или директории.

Опции

Не копировать содержимое файла. Скопировать только атрибуты файла. Если файл назначения существует, то создать для каждого такого файла резервную копию.

МЕТОД определяет, каким образом формируется имя резервной копии. МЕТОД может принимать значения:

  • none или off — не делать резервных копий, даже если включена опция --backup
  • numbered или t — имя резервной копии получит числовой индекс (пример: myfile.txt
Скопировать содержимое специальных файлов (файлов устройств и FIFO) при рекурсивном копировании. Данную опцию использовать не рекомендуется. Если файл назначения существует и не может быть открыт, то удалить его и попытаться снова (данная опция игнорируется, если используется опция -n ). Вывести запрос на подтверждение перезаписи существующего файла. Переходить по символическим ссылкам, указанным в качестве источника. Никогда не разыменовывать символические ссылки. Ссылки копируются, как символические ссылки. Сохранять у файлов атрибуты, указанные через запятую в списке СписокАтрибутов
Если возможно, то можно использовать дополнительные атрибуты: context , links , xattr , all Не сохранять атрибутиы, указанные в списке СписокАтрибутов Формировать результирующее имя (результирующий путь) каждого копируемого файла с учетом полного пути, который указан для данного файла.

Например, при использовании команды cp --parents a/b/myfile dstdir , файл myfile будет скопирован в директорию dstdir/a/b . То есть будут созданы промежуточные директории.

Копировать директории. Используется рекурсивное копирование — копируются директории и все их содержимое. Создавать или не создавать «легкую» клонированную копию файла, если данная функциональность поддерживается файловой системой.

КОГДА может принимать значения:
always — всегда создавать «легкую» копию файла. Создается ссылка на исходные данные. Фактического копирования данных не происходит. Блоки данных копируются только тогда, когда они изменяются.
auto — создается обычная полная копия.

Опция задает то, как будет выполняться копирование разреженных (sparse) файлов. Разреженный файл — это файл, в котором последовательности нулевых байтов (дыры) заменены на информацию об этих последовательностях. То есть в метаданных файла содержится список дыр.

КОГДА может принимать значения:
auto — (поведение по умолчанию) копировать разреженные файлы в разреженные файлы.
always — результирующий файл всегда разреженный, если в исходном есть достаточное количество нулевых последовательностей.
never — не делать результирующие файлы разреженными.

Удалить у каждого исходного файла символ слеш / на конце. Изменить символ суффикса, который добавляется к именам резервных копий (при использовании опции --backup ). По умолчанию СУФФИКС равен значку тильды Перемещать только если исходный файл новее, чем файл назначения или если файл-назначения отсутствует. Выводить информацию о каждом файле, который обрабатывает команда cp. Пропускать директории, расположенные на других файловых системах. Установить контекст SELinux для результирующего файла в значение по умолчанию. Установить контекст SELinux или SMACK в значение CTX .

Примеры использования команды cp

Скопировать файл в другую директорию

Скопируем файл myfile.txt в директорию mydir :


Скопируем файл myfile1.txt в новый файл myfile2.txt

Скопировать несколько файлов

Для копирования нескольких файлов нужно перечислить их через пробел. Послений параметр определяет результирующую директорию, в которую будут скопированы файлы.

Скопировать файл с подтверждением

Выведем запрос на подтверждение перезаписи результирующего файла, если он существует:

Показать информацию о копируемых файлах

При использовании опции -v выводится информация о том, какие файлы и куда копируются.

Скопировать директорию

Чтобы скопировать директорию и все ее содержимое нужно использовать опцию -r

Скопировать только если файлы новее

Скопируем файлы вида myfile*.txt (например, это могут быть файлы myfile1.txt myfile10.txt myfile2.txt ) в директорию mydir , но если результирующий файл существует, то копирование выполняется только в том случае, если исходный файл новее.

Не перезаписывать существующие файлы

Чтобы существующие файлы не перезаписывались, используется опция -n

Скопировать только атрибуты

Скопируем только атрибуты файла. Содержимое файла не копируется.

Создать резервную копию для результирующих файлов, если они существуют

Скопируем файл myfile1.txt в файл myfile2.txt . Если файл myfile2.txt существует, то будет создана его резервная копия.

Команда cp backup

Принудительно перезаписывать существующие файлы назначения

Если файл назначения существует и не может быть открыт и удален, то можно использовать опцию -f , чтобы принудительно перезаписать такой файл:

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

Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find.

Утилита копирования файлов cp

Название утилиты cp - это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.

Синтаксис и опции

Общий синтаксис cp выглядит вот так:

$ cp опции файл-источник файл-приемник

$ cp опции файл-источник директория-приемник/

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

Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:

  • --attributes-only - не копировать содержимое файла, а только флаги доступа и владельца;
  • -f, --force - перезаписывать существующие файлы;
  • -i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы;
  • -L - копировать не символические ссылки, а то, на что они указывают;
  • -n - не перезаписывать существующие файлы;
  • -P - не следовать символическим ссылкам;
  • -r - копировать папку Linux рекурсивно;
  • -s - не выполнять копирование файлов в Linux, а создавать символические ссылки;
  • -u - скопировать файл, только если он был изменён;
  • -x - не выходить за пределы этой файловой системы;
  • -p - сохранять владельца, временные метки и флаги доступа при копировании;
  • -t - считать файл-приемник директорией и копировать файл-источник в эту директорию.

Примеры копирования файлов в linux

Теперь, когда вы знаете основные опции, можно перейти к практике. Например, мы хотим скопировать некую картинку из домашней папки в подкаталог pictures:

Или можем явно указать имя новой картинки:

Копирование папок осуществляется с помощью ключа -r:

После выполнения этой команды копирования

/папка будет скопирована в папку

/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка

/документы будет перезаписана.

По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:

Есть и противоположная опция -n, означающая "никогда не перезаписывать существующие файлы".

Опция -u полезна в следующем случае: вы знаете или предполагаете, что в директории, куда копируется файл, есть старая его версия, тогда оператор -u выполнит замену на новую версию:

Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:

Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.

В случае, если важно сохранить права доступа к файлу и его владельца, нужно использовать опцию -p:

Для упрощения использования команды можно применять синтаксис фигурных скобок. Например, чтобы создать резервную копию файла, выполните:

Будет создан файл с таким же именем и расширением .bak

По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.

Копирование файлов по регулярным выражениям в Linux

В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:

find . -name 4 -exec cp <>

Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ <> - подставляет имя каждого файла.

Но не find'ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:

/ | egrep '[a-zA-Z]' | xargs cp -t

Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.

Копирование содержимого файлов в Linux

Вы можете не только копировать сами файлы, но и управлять их содержимым. Например, склеить несколько файлов в один или разрезать файл на несколько частей. Утилита cat используется для вывода содержимого файла, в комбинации с операторами перенаправления вывода Bash вы можете выполнять копирование содержимого файла Linux в другой файл. Например:

cat файл1 > файл2

Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:

cat файл1 файл2 > файл3

Специальное копирование файлов в Linux с помощью tar

Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д. важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации.

tar cf - /var | ( cd /mnt/var && tar xvf - )

Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.

Выводы

Теперь вы знаете, как выполняется копирование файлов Ubuntu и в Linux в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!

Читайте также: