How to copy with cp to include hidden files and hidden directories and their contents?
How can I do this all in one command without the pattern matching? What flag do I need to use?
Please, Eleven81, consider changing the accepted answer to that given by @bruno pereira, because it avoids creating a new folder. If not, let this comment be a warning to new readers to check also the other (most voted) answer. Tx.
How about running shopt -u dotglob to include hidden files then run cp -rfv /etc/skel /home/user which will also show you progress in case you are copying a big directory.
18 Answers 18
(Note that /home/user must not exist already, or else it will create /home/user/skel .)
This solution didn’t work for me. It did not copy hidden files. I’m using CentOS release 6.5. @Bruno’s solution did the trick.
Under ubuntu/debian this places the directory ‘skel’ inside target directory and not the recursed files inside skel. Use -T (no target) per below for proper use. ( -rT for recursive)
Answering a 7.5 year old question, you can run cp -r /etc/skel/. /home/user to avoid creating the subdirectory (note the /. following etc/skel).
Lets say you created the new folder (or are going to create one) and want to copy the files to it after the folder is created
mkdir /home/ cp -r /etc/skel/. /home/
This will copy all files/folder recursively from /etc/skel in to the already existing folder created on the first line.
I think it works because normally, this would create a new folder with the name of the last folder in the first argument. However, since that name is . , this behavior would require it to create an already-existing directory, so it just skips that step.
@Technext The default globbing in bash does not include filenames starting with a . , to change that you need to use the shopt -s dotglob command before to be able to include those files. So with * , by default, you are asking to copy all files recursively from this directory that can be expanded using * (which does not include hidden files by default). While on the other end with . you are using cp to recursively copy everything from «this directory».
The correct means of doing this is to use the -T (—no-target-directory) option, and recursively copy the folders (without trailing slashes, asterisks, etc.), i.e.:
This will copy the contents of /etc/skel to /home/user (including hidden files), creating the folder /home/user if it does not exist; however the -T option prevents the contents of /etc/skel from being copied to a new folder /home/user/skel should the folder /home/user exist.
this is the BEST answer of the bunch; its the only one that solves the problem without complicating it
bash itself has a good solution, it has a shell option , You can cp , mv and so on.:
shopt -s dotglob # for considering dot files (turn on dot files)
shopt -u dotglob # for don't considering dot files (turn off dot files)
Above solution is standard of bash
shopt # without argument show status of all shell options -u # abbrivation of unset -s # abbrivation of set
That’s usefull when you want to copy just content without creating new directory inside destination. Especially when destination dir is mount point.
rsync -rtv source_folder/ destination_folder/
rsync is good, but another choice:
-a, --archive same as -dR --preserve=all -d same as --no-dereference --preserve=links -R, -r, --recursive copy directories recursively
This answer is incorrect in terms of the original question asked (include hidden files): both cp -r as well as cp -a copy hidden files when cp . src dst or cp . src/ dst/ is used. It may be that this changed overtime.
The simplest way is:
The expression * includes all files and directories (also starting with a dot).
If you don’t want use above expression, then you can use the cp property, which is the ability to specify multiple sources for one target folder:
this would miss files like ..anything or . anything etc. — stackoverflow.com/a/31438355/2351568 contains the correct regex for this problem. || but anyway using shopt -s dotglob is still the better solution!
@DJCrashdummy unfortunately, I do not understand why you wrote your attention. After all, my solution takes into account the cases you write about. Regards
sorry wrong text! — the problem with your answer is, that it will also consider . and .. (which is equivalent to the current and its containing folder). || but still the answer in the link explains it further and provides a solution.
If your source and target directory have the same name, even if target directory exists, you can simply type:
This will copy the /etc/skel directory into /home/, including hidden files and directories.
Eventually, you can copy the directory and rename it in a single line :
cp -R /etc/skel /home/ && mv /home/skel /home/user
rsync -aP ./from/dir/ /some/other/directory/
You can even copy over ssh
rsync -aP ./from/dir/ username@remotehost:/some/other/directory/
There are various flags you can use: -a, —archive # archive (-rlptgoD)
-r, --recursive -l, --links # copy symlinks as links -p, --perms # preserve permissions -t, --times # preserve times -g, --group # preserve group -o, --owner # preserve owner -D # --devices --specials --delete # Delete extra files You may want to add the -P option to your command. --partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster. -P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.
Как скопировать скрытые файлы в Linux
Есть простой способ рекурсивно скопировать все файлы включают скрытые файлы в каталога в другой каталог? Использование Rsync команды является лучшим решением для этого.
# rsync -av --progress /source /destination
—progress: Показать прогресс в процессе передачи.
Другим решением, вы также можете использовать команду «cp» и рисунок матчей, введите следующую команду:
Так же можно использовать команду:
Так же можете использовать:
Тема «Как скопировать скрытые файлы в Linux’ подошла к завершению, но если есть вопросы, то пишите мне их.
2 thoughts on “ Как скопировать скрытые файлы в Linux ”
Долго бился над этой проблемой, но обновился до Ubuntu 17.10, дай, думаю, скопирую, получилось так:
cp -rp /home/potapov/ /mnt/disk2/
результат — каталог /potapov/ целиком скопирован в каталог /disk2/, что мне нужно не было. Удалил rm -rf /mnt/disk2/* ; rm -rf /mnt/disk2/.*, т.к. rm не хочет удалять содержимое каталога вместе со скрытыми файлами. Вероятно, нужно сделать каталог активным и можно сделать rm -rf . и все удалиться.
Чтобы скопировать содержимое potapov/ мне пришлось сделать этот каталог активным (cd ~), потом прописал следующее:
cp -rp . /mnt/disk2/ — и вуаля, содержимое potapov переезжает в /mnt/disk2 вместе со всеми скрытыми файлами и каталогами (имя которых начинается на точку «.»).
Сравнение их размеров все же показало незначительное отличие, почему так, пока не выяснил.
# du -s ~
87616 ~
# du -s /mnt/disk2
87720 /mnt/disk2
И последнее, копирование каталога активного пользователя у меня не получилось, т.к. в нем есть кэш файлы, которыми пользуется оболочка и не дает их скопировать. Пришлось выйти в рут и копировать соблюдая наследование прав, чтобы все файлы из home не скопировались с правами root.
Теперь моя задача заставить Ubuntu подумать, что точка монтирования home на другом блочном устройстве. К сожалению описание home с его текущей точкой монтирования изъята из файла /etc/fstab, где искать — ума не приложу.
Если в /etc/fstab нет /home то он не примонтирован, а просто существует там же, где и root. Добавляете /home в fstab, потом делаете перезагрузку
Как скопировать скрытые файлы (RSYNC)?
Пользуюсь командой, (копирую файлы без создания папки maildir, т.к папки на другом сервере /var/vmail/domain/user/. на старом /var/vmail/domain/user/.maildir/..
ls -1 /var/www/mailadmin/data/email/site.ru/ | while read u; do rsync -avz -D -e ssh /var/www/mailadmin/data/email/site.ru/$u/.maildir/* root@12.34.56.78:/var/vmail/site.ru/$u/ done
ls -1A — выводит и «скрытые» папки/файлы
man ls
-a, —all:
do not ignore entries starting with .
-A, —almost-all:
do not ignore entries starting with ., but not list implied . and ..
Но в вашем случае, нужно просто копировать без указания *
rsync -avz -D -e ssh /var/www/mailadmin/data/email/site.ru/$u/.maildir root@12.34.56.78:/var/vmail/site.ru/$u
ls -1A /var/www/mailadmin/data/email/site.ru/ | while read u; do rsync -avz -D -e ssh /var/www/mailadmin/data/email/site.ru/$u/.maildir/* root@12.34.56.78:/var/vmail/site.ru/$u/ done
Saboteur:
хочу скопировать все папки с письмами,
чтобы на новом был
/domain/user/ — письма со всеми папками типа .MyArchive
на старом сейчас /domain/user/.maildir/ и папки внутри
Так вы же указываете
/var/www/mailadmin/data/email/site.ru/$u/.maildir/*
То есть копировать все из $u/.maildir/ а не из $u/
Saboteur: в папке /.maildir/ есть папки типа: /.архив, /.работа, /.контрагент
вот у меня с их копированием проблемы
В таком случае не пользуйтесь *, просто укажите каталог
rsync -avz -D -e ssh /var/www/mailadmin/data/email/site.ru/$u/.maildir root@12.34.56.78:/var/vmail/site.ru/$u
Еще один вариант — в начало скрипта добавить
Тогда * будет выбирать файлы с точками.
Saboteur:
Может вы в курсе, как копировать файлы эти, без подтверждения пароля, просто копирую, и каждый раз при копировании каждой папки, просит пароль. Я так понял лучше это реализовать через ключи SSH ?
Ну два варианта.
Копируйте вышестоящую папку с полным содержимым, тогда это будет одна операция, один пароль на все.
Или настройте ssh ключи, для этого просто генерируете пару ключей
$ ssh-keygen
и копируете публичный ключ на удаленный сервер
$ ssh-copy-id root@12.34.56.78
После этого паролей не должно быть
Saboteur: Спасибо, а как скопировать:
из /mailadmin/data/email/site.ru/$u/.maildir
но чтобы просил пароль на папки домена (их всего три)
так пойдет?
ls -1A /var/www/mailadmin/data/email/ | while read $d | while read $u; do rsync -avz -e --progress /var/www/mailadmin/data/email/$d/$u/.maildir/ root@78.46.20.143:/var/vmail/$d/$u/ done
Вообще не очень понял, что вы хотите сделать такой конструкцией
Чтобы понять что происходит, выполните команду:
ls -1A /var/www/mailadmin/data/email/
Увидите, что попадает в «while read $d»
но в «while read $u» уже ничего попадать не будет, так как данные считаны в $d.
ну у меня есть
папки
/site1/user1/.maildir/письма
/site2/user1/.maildir/письма
я хочу перекинуть их так
/site1/user1/письма
/site2/user1/письма
но каждый раз не вводить пароль при копировании папок user1, user2 итд
V A: Ну так я же показал, как создать ssh ключи — если вы их создадите, то команды типа scp/rsync/ssh не будут запрашиваьт пароль.
Saboteur: а возможно ли, что если я с помощью RSYNC копирую с сервера #1 файлы в сервер #2, могут ли файлы на сервер №1 измениться?
Конечно могут.
В обычном случае (если вы не используете снапшоты на какой-нить zfs), рсинг делит файл на сегменты и пересылает их с чексуммами. Если в процессе пересылки вы поменяли данные в файле в сегменте, который еще не передавался — он перешлет уже обновленный сегмент. Если файл менялся кардинально (с изменением размера), рсинк может выдать просто ошибку о том, что файл недоступен, либо переслать его целиком.
Если файлы меняются незначительно, без изменения длины, повторный rsync перешлет только измененные блоки, поэтому вы можете просто запустить rsync дважды — первый раз, чтобы скопировать файлы, второй раз, чтобы скопировать только возможные изменения (он сам их определит).
Saboteur: Спасибо, то есть на исходном сервере (с которого копирую) в процессе копирования появится еще один файл (письмо например), то этот файл затрется?
По умолчанию rsync делает приемник таким же, как источник, но не наоборот, то есть на источнике ничего затираться не будет.
Но почитайте справку по rsync, там есть опции для двухсторонней синхронизации.