Как скопировать скрытые файлы и скрытые подкаталоги (те, что начинаются с точки) из папки 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/.* B
fromэтот другой вопрос суперпользователя. Однако он не копирует подкаталоги. Также пробовал 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