Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32

Работа команды "cp" для файлов с точками (скрытых)

16.11.2016, 12:17. Показов 6572. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасьте всем!

Чайник, поэтому сильно не ругайтесь. )

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

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

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

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

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

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

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


Так и должно быть?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.11.2016, 12:17
Ответы с готовыми решениями:

Удаление скрытых файлов и файлов только для чтения
Раньше удалял все файлы (в том числе скрытые и для чтения) в директории с помощью команды del /F /Q <path dir>*.*. Решил попробовать...

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

Поиск файлов на диске, за исключением скрытых файлов и папок
Часть кода, желательно использовать её. DirectoryInfo Di = new DirectoryInfo(@"F:"); foreach (FileInfo FileInfo in...

35
Заблокирован
16.11.2016, 12:37
Если ты запустишь команду ls -la, то увидишь, что есть в директории такие ссылки с названиями . и ..
Почитай про них.
И аккуратней с точками.
1
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
16.11.2016, 13:56  [ТС]
Спасибо!

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

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

Ну почему? (с)

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

Первые авторы утилит разные, остальные двое одинаковые.
0
Заблокирован
16.11.2016, 15:14
Цитата Сообщение от siffok Посмотреть сообщение
Т.е. получается, что команда cp -r работает с дескрипторами текущего и родительского каталогов как с обычными каталогами?
Это не от команд должно зависеть, wildcard'ы шелл интерпретирует.
Цитата Сообщение от siffok Посмотреть сообщение
И там и там задаю отбор по .*, а результат совершенно разный!
Какой? У меня, например, вполне предсказуемый:
Bash
1
2
3
4
5
6
$ mv .* dir
mv: cannot move ‘.’ to ‘dir/.’: Device or resource busy
mv: cannot move ‘..’ to ‘dir/..’: Device or resource busy
$ cp -r .* dir
cp: cannot copy a directory, ‘.’, into itself, ‘dir/.’
cp: will not create hard link ‘dir/b’ to directory ‘dir/.’
0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
17.11.2016, 10:10  [ТС]
Цитата Сообщение от nimazzzy Посмотреть сообщение
Это не от команд должно зависеть, wildcard'ы шелл интерпретирует.
С моими кривыми ручками так не получается. Т.е. шаблоны одинаковые, а результаты разные. В разных системах.

Цитата Сообщение от nimazzzy Посмотреть сообщение
Bash
1
2
3
4
5
6
$ mv .* dir
mv: cannot move ‘.’ to ‘dir/.’: Device or resource busy
mv: cannot move ‘..’ to ‘dir/..’: Device or resource busy
$ cp -r .* dir
cp: cannot copy a directory, ‘.’, into itself, ‘dir/.’
cp: will not create hard link ‘dir/b’ to directory ‘dir/.’
Это ответы команд. Правильно? У меня пока сложно с правильной терминологией. Тут вопросов нет - всё так.

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

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

Не знаю как из виртуалбокса копипастить, поэтому дам скрины.
Миниатюры
Работа команды "cp" для файлов с точками (скрытых)   Работа команды "cp" для файлов с точками (скрытых)  
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
17.11.2016, 10:50
siffok, Кончайте страдать ерундой. Вам уже порекомендовали про
Цитата Сообщение от nimazzzy Посмотреть сообщение
ссылки с названиями . и ..
Почитай про них.
В приведенном примере кроме самих команд надо еще учитывать где именно Вы находитесь. Неужели непонятно что скопировать каталог в котором Вы находитесь не составляет проблем, то переместить его «выдернув из-под себя» не получится?
0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
17.11.2016, 12:54  [ТС]
Цитата Сообщение от Marinero Посмотреть сообщение
siffok, Кончайте страдать ерундой.
Что-то не так?
Разбираю азы и наталкиваюсь на непонятку: гляжу в учебники - ноль без палочки, читаю мануал - никаких ремарок.
Знаете - подскажите, нет - спокойно пройдите мимо.
Цитата Сообщение от Marinero Посмотреть сообщение
Вам уже порекомендовали проВ приведенном примере кроме самих команд надо еще учитывать где именно Вы находитесь. Неужели непонятно что скопировать каталог в котором Вы находитесь не составляет проблем, то переместить его «выдернув из-под себя» не получится?
Внимательно и спокойно прочтите мой вопрос. К переносу претензий нет - команда mv по шаблону .* переносит только файлы и каталоги с точкой из указанного каталога, как и другие команды по работе с объектами файловой системы - файлами и каталогами (за ссылки ещё не брался). Аналогично с шаблоном *.

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

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

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

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


ЗЫ Может кто в контакте с разработчиками: хотелось бы узнать -это фича, баг или мои кривые руки? )
Миниатюры
Работа команды "cp" для файлов с точками (скрытых)   Работа команды "cp" для файлов с точками (скрытых)  
0
Заблокирован
17.11.2016, 14:01
Цитата Сообщение от siffok Посмотреть сообщение
Но стоит добавить ключ -r, как шаблон "звезда с точкой" начинает обрабатывать дескриптор родительского каталога как каталог (по моим предположениям) и в целевой каталог копируются (никто ничего не выдёргивает не из под кого) файлы и каталоги из родительского...
Что с этим не так? -r это recursive. Рекурсивный обход - это все директории, и под-директории.
.. является директорией. Поэтому cp в нее зайдет так же, как в любую другую. Начинается обход с самой первой - . Текущая. Соответственно, в ней находятся все твои директории и файлы. Копируются. Потом придет очередь .. это тоже директория, в нее тоже нужно зайти и скопировать. А без рекурсии - только файлы. Что тут не так?
Цитата Сообщение от siffok Посмотреть сообщение
команда mv по шаблону .* переносит только файлы и каталоги с точкой из указанного каталога
Это зависит от шелла. Я еще раз повторяю, что wildcards парсятся шеллом и отдаются программе. И в моем случае mv ничего никуда не передвинет по .*, потому что
Code
1
2
3
$ mv b/.* /aaa/
mv: cannot move ‘b/.’ to ‘/aaa/.’: Device or resource busy
mv: cannot move ‘b/..’ to ‘/aaa/..’: Device or resource busy
В убунте dash я не знаю, что отдает команде на вход. Запусти под strace и посмотри.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
17.11.2016, 16:26
Цитата Сообщение от siffok Посмотреть сообщение
Внимательно и спокойно прочтите мой вопрос.
Никак не получается спокойно смотреть как засирают мозги себе и другим, когда надо просто прочитать инструкцию/мануал и немного напрячь мозги:
Если .. — это ссылка на каталог выше, почему Вас удивляет что ср переходит по этой ссылке (т.к. включена опция --recursive) и
Цитата Сообщение от siffok Посмотреть сообщение
в целевой каталог копируются файлы и каталоги находящиеся в каталоге на один уровень выше текущего
А mv(rm, …) этого не делают по той простой причине, что
Цитата Сообщение от Marinero Посмотреть сообщение
«выдернув из-под себя» не получится
ни перенести, ни удалить, т.к. каталог занят Вами.
Цитата Сообщение от siffok Посмотреть сообщение
Если пользоваться командой cp -r с шаблоном .*
Опции нужны для того чтобы управлять поведением команды, а не запулить первое попавшееся, а потом разбирать, как же это так получилось?
0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
18.11.2016, 11:19  [ТС]
Ок. Всё понятно.

А именно надо запомнить следующее:

Команда cp -r не работает с шаблонами так как работают команды cp, mv. - "вилька, тарелька" (с)

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

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

Использовать ссылки: ссылками настраиваем абсолютные пути, а в скриптах работаем со ссылками - так проще переносить скрипты из среды в среду или восстанавливать работоспособность при её изменении.

Рекурсия (вложение) работает "во вне", потому что дескриптор родительского каталога (..) туда показывает. Отсюда становиться ясно, почему во вложении обрабатываются все файлы и каталоги (с точкой и без) - по сути работает конвеер, т.е. ключи не передаются, как команда sudo.

Почему-то в мануале cp ключи -R и -r идентичны, что навевает на мысли.

Всем спасибо!
0
Заблокирован
18.11.2016, 12:17
Цитата Сообщение от siffok Посмотреть сообщение
Команда cp -r не работает с шаблонами так как работают команды cp, mv. - "вилька, тарелька" (с)
Опять ты не так понял. Эти команды, в принципе, с шаблонами не работают. С шаблонами работает твоя оболочка, а команда на вход уже принимает обработанные ею данные.
cp -r .* вызывается не с шаблоном .*, а с перечнем файлов и директорий, имена которых начинаются с точки. Прям со списком, а не с шаблонов. Вот со именами, как они есть. А не с шаблоном. Не с шаблоном. Шаблоны команда не обрабатывает эта. Она получается список имен. Список. Не шаблон. А список.
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
18.11.2016, 12:42
Цитата Сообщение от siffok Посмотреть сообщение
Ок. Всё понятно.
Ничего не понятно. При верных предпосылках какие-то «вывернутые набок» выводы:
  1. Перед использованием команды стоит прочитать её man / --help и с помощью опций получать то поведение, которое требуется.
  2. При использовании скрытых файлов надо учитывать наличие в каталоге ссылок . (на самого себя) и .. (на каталог выше). Решается это применением для скрытых файлов другого шаблона (.[!.]* например)
А что Вы написали — бредне верно.
0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
18.11.2016, 14:33  [ТС]
Цитата Сообщение от nimazzzy Посмотреть сообщение
а с перечнем файлов и директорий, имена которых начинаются с точки.
(.) и (..) - это записи которые содержат дескрипторы для текущего и родительского каталогов, используемых в файловых системах ext2/3/4 для структурирования, служат для получения точки отсчёта при переходе ну уровень выше в структуре каталогов. (Брайан Уорд "Внутреннее устройство LIinux", Питер 2016, стр.115).

Т.е. если оболочка переварила шаблон как смогла, а именно дескриптор родительского каталога (..), точнее запись дескриптора, восприняла как ссылку на его содержание, то команда получила список файлов родительского каталога и его обработала. Правильно?

Получается Линукс - это совсем другой мир, в котором одним и тем же инструментом можно делать всё что угодно!

Цитата Сообщение от Marinero Посмотреть сообщение
Решается это применением для скрытых файлов другого шаблона (.[!.]* например)[/list]
Потребовалось два дня и куча постов, а ведь достаточно было просто написать шесть знаков: .[!.]*, которые всё сразу объяснили!!!


Всем огромное Спасибо! Живое общение с преподавателем никогда не заменит мертвый учебник.
0
Заблокирован
18.11.2016, 15:03
Цитата Сообщение от siffok Посмотреть сообщение
Т.е. если оболочка переварила шаблон как смогла, а именно дескриптор родительского каталога (..), точнее запись дескриптора, восприняла как ссылку на его содержание, то команда получила список файлов родительского каталога и его обработала. Правильно?
Почему как смогла? Как есть. .* - имена, начинающиеся с точки. По сути cp -r .* в пустом каталоге от оболочки получит параметры два пераметра - . и .. Она не будет знать, какой я там шаблон передавал.
0
18.11.2016, 20:40

Не по теме:

Цитата Сообщение от siffok Посмотреть сообщение
Немного лирики:
То что Вы назвали себя «чайником» не извиняет отсутствие желания систематизировать знания и не дает право подменять своими домыслами справочную информацию. А уж тем более совсем неуместен безапеляционный тон Ваших «выводов».
Цитата Сообщение от siffok Посмотреть сообщение
шесть знаков: .[!.]*, которые всё сразу объяснили!!!
Никогда! частный случай применения не объяснял правило

0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
22.11.2016, 10:57  [ТС]
Стереотипы работы с разными ОС и подходы их создателей очень сложно ломать.
Поэтому умолчания у всех разные. Мне, "окошечнику" нужно понять ваши (линуксоидные) умолчания, а вам это не нужно, поэтому я всегда буду не прав и это данность (ведь знания нужны мне, а не вам). И это не лирика.

Для меня открытие, то что команда копирования может выдавать такое - половину книжку изучил, теперь закрепляю, но про то что дескрипторы могут так обрабатываться не написано, потому что оно по-умолчанию.

Цитата Сообщение от nimazzzy Посмотреть сообщение
Почему как смогла? Как есть. .* - имена, начинающиеся с точки. По сути cp -r .* в пустом каталоге от оболочки получит параметры два пераметра - . и .. Она не будет знать, какой я там шаблон передавал.
Потому что в моём мире дескриптор не файл и не каталог. ) Теперь всё изменилось благодаря вам (это множественное число, если что - один следователь добрый, второй злой - классика).
0
Заблокирован
22.11.2016, 11:04
Цитата Сообщение от siffok Посмотреть сообщение
Потому что в моём мире дескриптор не файл и не каталог. )
Хммм... В принципе, так и есть. Дескриптор это не файл и не каталог
0
1 / 1 / 0
Регистрация: 17.02.2016
Сообщений: 32
22.11.2016, 11:18  [ТС]
Никак не пойму какую кнопку жмакать для мультиплицирования...
И даже попытка отдельных ответов потеряла вторую половину поста, поэтому уж как есть.
Цитата Сообщение от Marinero Посмотреть сообщение

Не по теме:

То что Вы назвали себя «чайником» не извиняет отсутствие желания систематизировать знания и не дает право подменять своими домыслами справочную информацию. А уж тем более совсем неуместен безапеляционный тон Ваших «выводов».Никогда! частный случай применения не объяснял правило

В предыдущем сообщении пояснил про умолчания - если мой тон показался таковым, то это совсем по-другой причине: фактические примеры для меня легче в понимании и ход от противного очень даже эффективная мера по передаче знаний. Также как и с частными случаями: индукция как зеркало дедукции.
Благодаря Вам, теоретическое наставление nimazzzy сложилось в понимание.

К тому же частный случай здесь везде, а именно:

Вернёмся к нашему барану: cp.

Это команда по описанию копирует файлы и каталоги, но без ключей (-R, -r, --receyrsive) копировать каталоги отказывается.
Но почему тогда она сообщает о том что не скопировала каталог, если её об этом не просили?
Понимаю что "вопрос не по зарплате", но именно этот частный случай и ввёл меня в заблуждение - ну сообщает команда что она пропустила (.) и (..) - значит так и надо сообщать - даже мысли не было что я ошибаюсь в использовании шаблона!

Копирую файлы cp * dir, а в ответ прилетает cp: пропускает каталог 'aaa', но ведь команды на копирование каталога не было?

Картинку вставлять не буду - смысла нет.

ЗЫ Прошу прощения что много букоф - хочу донести мысль без искажений, но всё равно умолчания своё дело делают. (
0
Заблокирован
22.11.2016, 11:34
Цитата Сообщение от siffok Посмотреть сообщение
Но почему тогда она сообщает о том что не скопировала каталог, если её об этом не просили?
Хорошо. Как мы с тобой уже знаем, представленные шаблоны обрабатываются оболочкой, а не программой. То есть, cp про * ничего не знает. Когда оболочка запускает cp, то передает ей список того, что попало под шаблон *. То есть, список имен из текущей директории. И aaa там, разумеется, тоже есть. А теперь представь, cp видит, что ты явно ей передал имя aaa, но понимает, что это директория. Конечно, она об этом пишет. Это, по сути, как если бы ты запустил команду
cp aaa dir
Если она промолчит, ты подумаешь, что все ок, и aaa скопировалось в dir. Но это же не так! Так что, ее поведение крайне правильное. Сказать, что переданное ей имя - это директория, но из-за отсутствия опции рекурсии, ее она не копирует. Все логично до жути
1
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
22.11.2016, 11:59
Лучший ответ Сообщение было отмечено Marinero как решение

Решение

Всё станет намного понятнее если Вы поймете, что именно такое каталог в Линукс. Упрощенно это просто файл со списком «находящегося в нем» (которое на самом деле находится на диске и никаким образом не соотносится с каталогом). Поэтому копировать каталог без содержимого (не рекурсивно) нет смысла, вот система и напоминает, что в том, что Вы отдали на копирование («*») есть каталоги, но система их пропустила (потому как нет смысла), но обязана предупредить (потому как в команде присутствовали).
Почитайте ещё про «жесткие» и символические ссылки — это тоже поможет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2016, 11:59
Помогаю со студенческими работами здесь

Отключить отображения расширения файлов и скрытых системных файлов
Как средствами delphi можно отключить отображения расширения файлов и скрытых системных файлов?

Как осуществить поиск файлов только скрытых или только для чтения
Ребят, помогите пожалуйста, как осуществить поиск файлов только скрытых или только для чтения с помощью Directory.GetFiles ну или как тогда...

Удаление скрытых файлов
#include <System.IOUtils.hpp> if(TDirectory::Exists("%ProgramData%\\MP")) TDirectory::Delete("%ProgramData%\\MP", true);//Папка удаляться...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru