Как скопировать скрытые (начинающиеся с точки) файлы и подкаталоги в Linux?

Как скопировать скрытые (начинающиеся с точки) файлы и подкаталоги в Linux?

Как скопировать скрытые файлы и скрытые подкаталоги (те, что начинаются с точки) из папки A в папку B? Например, если у меня такая структура:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

Я хотел бы скопировать в B только скрытые файлы и скрытые подкаталоги из A:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

Я уже пробовал эту команду: cp A/.* Bfromэтот другой вопрос суперпользователя. Однако он не копирует подкаталоги. Также пробовал cp -r A/.* B, но копирует, .так что я заканчиваю с точной копией A (включая обычные файлы). Любая помощь приветствуется.

решение1

Если вы ищете только скрытые файлы и папки на уровне A и не хотите, например,

A/b/.hidden

для копирования вы должны иметь возможность использовать это:

cp -r A/.[^.]* B

По сути, это означает копирование всего, что начинается с буквы «а» ., а затем любого символа, отличного от «а .». Это отфильтровывается .и..

Редактировать: Удалил -p из команды cp, поскольку Аскер не указал, что хочет сохранить какие-либо права собственности, даты и т. д.

решение2

Проблема в A/.*том, что есть каталог ., в Aкотором также совпадает шаблон.

Вы можете включить расширенные шаблоны шаров и использовать следующее:

shopt -s extglob
cp -r A/.!(?(.)) B    

Он соответствует файлам, имена которых начинаются с точки, а второй символ не является ни точкой, ни ничем ( ?(.) соответствует ничему или точке, !(...) отрицает это, т. е. !(?(.)) соответствует всему, что не является ничем или точкой).

решение3

Для таких случаев я бы рекомендовал использоватьfindвместоcpтак:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

Основной синтаксис выглядит следующим образом:

  • find A/ -type f: findэлементы в каталоге A/, тип которых — файл (а не каталог)…
  • -maxdepth 1 -name '.*': Для этого maxdepthиз 1 каталогов и чей nameначинается с ..
  • -exec cp -p {} B/ \;: И как только эти файлы будут найдены, execкоманда cpс -pфлагом сохранения даты/времени от источника ( {}) до назначения B/.

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

решение4

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

cp -r A/.[a-zA-Z0-9]* B

Связанный контент