Как скопировать скрытые файлы и скрытые подкаталоги (начиная с точки) в папке 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
из этого другого вопроса суперпользователя . Тем не менее, он не копирует подкаталоги. Также пытался cp -r A/.* B
, но он копирует, .
поэтому я заканчиваю с точной копией A (включая обычные файлы). Любая помощь приветствуется.
источник
..c
..*[^.]
но тогда вы пропустите файлы, которые заканчиваются на.
. Я думаю, что вам действительно понадобится расширенная глобализация, чтобы действительно учесть все случаи.Проблема в
A/.*
том, что существует каталог,.
вA
котором также соответствует шаблону.Вы можете включить расширенные шаблоны глобусов и использовать следующее:
Он соответствует файлам, имя которых начинается с точки, а второй символ не является ни точкой, ни ничем (? (.) Ничего не соответствует или точка,! (...) отрицает его, т.е.! (? (.)) Соответствует всему остальному чем ничто или точка).
источник
.!(@(|.))
(AFAICT) эквивалентен приведенному выше, (IMNSHO) немного понятнее, и только на один символ длиннее.Для таких случаев рекомендуется использовать
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 "\."
фильтрует каталоги с точкой (т.е. скрытые каталоги)cp -r
копировать рекурсивноЯ создал структуру файлов и папок для A и выполнил команду в Git Bash (у меня сейчас нет Linux), и это сработало.
источник
A B
, и тогда они будут работать неожиданно, потому что они расширятся доcp -r A B/.dotfile B
. Общий совет не разбиратьfind
илиls
выводить вообще. Если вы используете,find
вы должны также использовать его собственные параметры для фильтрацииgrep
, а если вы передаетеfind
вывод в другое место, используйте-print0
или напрямую вызовите нужную команду. Смотритеfind
руководство .extglob
настройки).find
разбор.В качестве альтернативы вы можете использовать эту другую команду, если второй символ буквенно-цифровой ( источник ):
источник
.@foo
или..c
.