9

Как скопировать скрытые файлы и скрытые подкаталоги (начиная с точки) в папке 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 (включая обычные файлы). Любая помощь приветствуется.

5 ответов5

14

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

A/b/.hidden

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

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

Это в основном означает копировать все, что начинается с . а затем любой символ, кроме . Это отфильтровывает . и ..

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

4

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

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

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

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

2

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

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

Основной синтаксис разбивается следующим образом: find элементы в каталоге A/ , тип которых является файлом (а не каталогом), и сделайте это для maxdepth из 1 каталогов и чье name начинается с . , И как только эти файлы будут найдены, exec команду cp с флагом -p чтобы сохранить дату / время от источника ({}) до места назначения B/ .

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

0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d предоставляет рекурсивный список в A только с каталогами
  • grep -E "\." фильтрует каталоги с точкой (т.е. скрытые каталоги)
  • здесь была нужна опция -E, потому что без нее она также означает "текущий каталог"
  • обратный слеш должен избегать значения в регулярном выражении слова "любой символ"
  • cp -r для рекурсивного копирования

Я создал структуру файлов и папок для A и выполнил команду в Git Bash (у меня сейчас нет Linux), и это сработало.

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .