- Linux – How To Copy a Folder [ Command Line Option ]
- How To Copy a Folder with cp Command
- Linux cp command examples
- More examples of cp command to copy folders on Linux
- Use Linux rsync Command to copy a folder
- Conclusion
- Команда cp: правильное копирование папок с файлами в *nix
- Выводы
- Послесловие
- How to Copy a Directory in Linux Command Line [Beginner’s Tip]
- Copy directory in Linux command line
- A few things to note about copying directory in Linux
- The destination directory doesn’t exist? It will be created
- Can’t create nested directory while copying
- Preserve the original file attributes
- Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
- Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
- Создание, изменение и удаление файлов и каталогов
- touch
- mkdir
- rmdir
- Копирование, переименование и перемещение файлов и каталогов
- Просмотр и редактирование
- grep, egrep, fgrep, rgrep
- ls, dir, vdir
- Поиск файлов
- locate
- whereis
- which
- Другие команды
Linux – How To Copy a Folder [ Command Line Option ]
How To Copy a Folder with cp Command
The cp command is a Linux command for copying files and directories. The syntax is as follows:
Linux cp command examples
In this example copy /home/vivek/letters/ folder and all its files to /usb/backup/ directory:
cp -avr /home/vivek/letters /usb/backup
Where,
- -a : Preserve the specified attributes such as directory an file mode, ownership, timestamps, if possible additional attributes: context, links, xattr, all.
- -v : Verbose output.
- -r : Copy directories recursively.
More examples of cp command to copy folders on Linux
Copy a folder called /tmp/conf/ to /tmp/backup/:
$ cp -avr /tmp/conf/ /tmp/backup/
Sample outputs:
Fig.01: cp command in action
Use Linux rsync Command to copy a folder
You can also use rsync command which is a fast and extraordinarily versatile file copying tool. It can make copies across the network. The syntax is as follows for the rsync command
To backup my home directory, which consists of large files and mail folders to /media/backup, enter:
$ rsync -avz /home/vivek /media/backup
I can copy a folder to remote machine called server1.cyberciti.biz as follows:
$ rsync -avz /home/vivek/ server1.cyberciti.biz:/home/backups/vivek/
Where,
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
- -a : Archive mode i.e. copy a folder with all its permission and other information including recursive copy.
- -v : Verbose mode.
- -z : With this option, rsync compresses the file data as it is sent to the destination machine, which reduces the amount of data being transmitted something that is useful over a slow connection.
Fig.02: rsync command in action
Conclusion
You just learned how to copy a folder on a Linux like operating system using the cp command and rsync command. In conclusion, use rsync for a network folder transfer and cp for a local disk transfer.
🐧 Get the latest tutorials on Linux, Open Source & DevOps via
Источник
Команда cp: правильное копирование папок с файлами в *nix
В этой статье будут раскрыты некоторые неочевидные вещи связанные с использованием wildcards при копировании, неоднозначное поведение команды cp при копировании, а также способы позволяющие корректно копировать огромное количество файлов без пропусков и вылетов.
Допустим нам нужно скопировать всё из папки /source в папку /target.
Первое, что приходит на ум это:
Сразу исправим эту команду на:
Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r .
После копирования мы обнаружим, что скопировались не все файлы — были проигнорированы файлы начинающиеся с точки типа:
.profile
.local
.mc
и тому подобные.
Почему же так произошло?
Потому что wildcards обрабатывает shell ( bash в типовом случае). По умолчанию bash проигнорирует все файлы начинающиеся с точек, так как трактует их как скрытые. Чтобы избежать такого поведения нам придётся изменить поведение bash с помощью команды:
Чтобы это изменение поведения сохранилось после перезагрузки, можно сделать файл wildcard.sh c этой командой в папке /etc/profile.d (возможно в вашем дистрибутиве иная папка).
А если в директории-источнике нет файлов, то shell не сможет ничего подставить вместо звёздочки, и также копирование завершится с ошибкой. Против подобной ситуации есть опции failglob и nullglob . Нам потребуется выставить failglob , которая не даст команде выполниться. nullglob не подойдёт, так как она строку с wildcards не нашедшими совпадения преобразует в пустую строку (нулевой длины), что для cp вызовет ошибку.
Однако, если в папке тысячи файлов и больше, то от подхода с использованием wildcards стоит отказаться вовсе. Дело в том, что bash разворачивает wildcards в очень длинную командную строку наподобие:
На длину командной строки есть ограничение, которое мы можем узнать используя команду:
Получим максимальную длину командной строки в байтах:
Получим что-то типа:
Итак, давайте будем обходиться вовсе без wildcards.
Давайте просто напишем
И тут мы столкнёмся с неоднозначностью поведения cp . Если папки /target не существует, то мы получим то, что нам нужно.
Однако, если папка target существует, то файлы будут скопированы в папку /target/source.
Не всегда мы можем удалить заранее папку /target, так как в ней могут быть нужные нам файлы и наша цель, допустим, дополнить файлы в /target файлами из /source.
Если бы папки источника и приёмника назывались одинаково, например, мы копировали бы из /source в /home/source, то можно было бы использовать команду:
И после копирования файлы в /home/source оказались бы дополненными файлами из /source.
Такая вот логическая задачка: мы можем дополнить файлы в директории-приёмнике, если папки называются одинаково, но если они отличаются, то папка-исходник будет помещена внутрь приёмника. Как скопировать файлы из /source в /target с помощью cp без wildcards?
Чтобы обойти это вредное ограничение мы используем неочевидное решение:
Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки «.» и «..», являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.
- При копировании cp проверяет существование и пытается создать /target/.
- Такая директория существует и это есть /target
- Файлы из /source скопированы в /target корректно.
Итак, вешаем в жирную рамочку в своей памяти или на стене:
Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе.
Выводы
Если нужно скопировать все файлы из одной папки в другую, не используем wildcards, вместо них лучше использовать cp в сочетании с точкой в конце папки-источника. Это скопирует все файлы, включая скрытые и не завалится при миллионах файлов или полном отсутствии файлов.
Послесловие
vmspike предложил аналогичный по результату вариант команды:
ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется.
Благодарности:
Источник
How to Copy a Directory in Linux Command Line [Beginner’s Tip]
If you are new to Linux command line, you probably have this question in mind: How do I copy a directory and the files inside it to another directory in Linux command line?
Here’s how to copy a directory in Linux:
You probably already know that you can use cp command to copy files in Linux. Do you know that you can use the same cp command to copy a folder in Linux command line?
Hah! You already tried that and perhaps got this error:
Let me show you a thing or two about copying directory in Linux.
Copy directory in Linux command line
You can definitely use the same cp command but with the recursive option -r to copy a folder with its content to another folder. The above mentioned error also hints that you missed the -r option.
All you got to do is to use the command in this fashion:
And now if you use ls command on the destination directory, it should have the entire source directory inside it.
The -r option allows the recursive option. This means the entire content of the directory including its own subdirectories, everything in the directory will be copied to the destination.
A few things to note about copying directory in Linux
Here are a couple of things to note and tips about copying folders.
The destination directory doesn’t exist? It will be created
If the destination directory doesn’t exist (but the path exists), it will be created up to one level (explained in the next section). However, it will now copy the contents of the source directory, not the source directory itself.
For example, if you do this:
The non_existing_directory will be created with the content of the source_directory but it won’t have the source_directory inside it. Just the files of source_directory will be copied. It would be like non_existing_directory will be a replica of source_directory.
Can’t create nested directory while copying
You cannot use the above command to create nested directory structure.
For example, if you try to use cp -r source_dir dir1/dir2/dir3 but dir2 and dir3 don’t exist, it won’t create the nested directory structure and the command fails.
Preserve the original file attributes
One last tip to keep things short. If you use the -a option along with the -r option, it will preserve the original file information such as file permissions, file timestamps etc. It will archive the directory to the new location instead of creating it afresh.
That’s it
This much information should be enough for you to know how to copy a directory in Linux. If you have questions or suggestions, please feel free to leave a comment.
Источник
Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
Вторая статья из серии статей-шпаргалок, предназначенных для быстрого доступа к наиболее часто используемым командам. Как было описано в предыдущей — Debian. Шпаргалка сисадмина. Операции с пользователями — вся упомянутая информация является общедоступной и не представляет из себя чего-то уникального . Почти все это вы сможете найти в справочных страницах официального дистрибутива Debian 7.7, а на остальные источники даны ссылки.
Если интересуетесь ОС Debian, рекомендую обратиться к тегу Debian на моем блоге.
Debian. Шпаргалка сисадмина. Работа с файлами и каталогами
Команды сгруппированы по выполняемым изменениям.
Создание, изменение и удаление файлов и каталогов
Создать файл можно разными способами, в большинстве случаев я использую nano, если нужно создать текстовый файл и сразу в него что-то записать. В статье «Как создать пустой файл в Linux» есть аж 12 способов.
touch
Изменяет временные штампы файла
Небольшая выдержка из «манов»:
Если заданный файл еще не существует, то он создается (как пустой файл с правами доступа 0666, с учетом umask), если не задана опция -c.
Создание файла file_test01 в текущем каталоге:
touch file_test01
Создание файла с указанием метки времени:
touch -t 200701310846.26 file_test01
Можно указать и будущую дату.
Nano’s ANOther editor, an enhanced free Pico clone
Файл будет создаy в том случае, если будет не пустым.
Создание файла file_test02 в текущем каталоге:
nano file_test02
На мой взгляд nano — отличный универсальный редактор, который к тому же установлен в Debian по умолчанию. Если все же nano не подходит, можете воспользоваться vim, gedit или чем-то другим.
Вообще самым элегантным способом создания пустого файла мне показался вариант простого вывода данных в текстовый файл, этот способ есть в упомянутой выше статье.
Создание пустого файла file_test03 в текущем каталоге:
> file_test03
Про создание файлов на этом все.
mkdir
Создать каталог testdir01 в /root/:
mkdir /root/testdir01
Создать каталог testdir02 в /root/ с полными правами доступа только у владельца, у остальных нет прав даже на чтение (о правах доступа см. ниже):
mkdir -m 700 /root/testdir02
-m — Устанавливает права доступа к создаваемым каталогам. Эти права могут быть заданы либо в символьном виде, как описано в chmod(1), либо в виде восьмеричного числа.
Для удаления файлов и каталогов можно воспользоваться командами ниже.
Удаляет файлы или каталоги
Удалить файл testfile01 из каталога /root/:
rm /root/testfile01
Каталог этой командой без дополнительных аргументов удалить не получится:
rm testdir01
rm: невозможно удалить «testdir01»: Это каталог
…но можно удалить каталог рекурсивно со всеми файлами, например, вот так:
rm -r testdir01
-r — Рекурсивное удаление дерева каталогов.
rmdir
Удаляет пустые каталоги
Удалить каталог testdir04 из текущего расположения:
rmdir testdir04
Непустые каталоги удалить не получится:
rmdir /root/testdir02
Придется использовать rm, как описано выше.
Копирование, переименование и перемещение файлов и каталогов
Перемещает (переименовывает) файлы
Переместить файл file_primer03 из каталога /root/ в каталог /root/testdir02/, при этом задать ему новое имя — fileprimer031:
mv /root/file_primer03 /root/testdir02/fileprimer031
Хотя для изменения имени файла существует и другая команда.
Для копирования файлов воспользуйтесь другой командой.
Копирование файлов и каталогов
Копирование файла test_file01 из текущего расположения в каталог testdir02:
cp test_file01 testdir02/test_file01
Рекурсивное копирование каталога testdir02 из текущего расположения в новый каталог testdir02_copy:
cp -r testdir02 testdir02_copy
Очень интересное описание параметра:
-r — Копировать каталоги рекурсивно; выполнять какие-то, неопределенные стандартом действия, когда попадаются объекты, не являющиеся обычными файлами или каталогами. (Так, разрешается, и фактически одобряется, наличие опции-r как синонима для -R. Однако, глупое поведение, которое проявляет версия cp в GNU 4.0 не запрещается.)
Просмотр и редактирование
О консольных текстовых редакторах было упомянуто в самом начале статьи, поэтому в этом разделе рассматриватся они не будут.
Concatenate files and print on the standard output
Отображение содержимого файла test_file01:
cat test_file01
Объединение файла test_file01 с файлом test_file02, результат записывается в файл test_file03 в текущем расположении:
cat test_file01 test_file02 > test_file03
Sort lines of text files
Сомневаюсь, что у меня получится описать работу команды «sort» лучше, чем это сделано в статье «HuMan: sort«.
Output the first part of files
Отображение первых строчек файла test_file01 (по умолчанию последние 10 строчек):
head test_file01
Отображение первых 4 строчек файла test_file01:
head -n 4 test_file01
-n — print the first K lines instead of the first 10; with the leading -‘, print all but the last K lines of each file
Output the last part of files
Отображение последних строчек файла test_file01 (по умолчанию последние 10 строчек):
tail test_file01
Отображение последних 4 строчек файла test_file01:
tail -n 4 test_file01
-n — output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth
Read from standard input and write to standard output and files
Удобная команда, предназначеня для одновременного вывода информации на экран и в файл.
Отправка пяти эхо-запросов до узла ya.ru с выводом информации на экран и в файл ping_ya_c_5.ru:
ping -c 5 ya.ru | tee ping_ya_c_5.ru
О всех описанных выше командах можно подробнее прочитать в статье «Операции с файлами и фильтрация».
grep, egrep, fgrep, rgrep
Print lines matching a pattern
О данных командах, в частности речь идет о grep, в некотором будущем я планирую написать отдельную статью, т.к. модели их применения достаточно объемны.
ls, dir, vdir
Выводит содержимое каталога
Отобразить список файлов в текущем расположении:
ls -l
-l — Выдавать (в одноколоночном формате) тип файла, права доступа к файлу, количество ссылок на файл, имя владельца, имя группы, размер файла (в байтах), временной штамп и имя файла.
Отобразить список файлов в текущем расположении рекурсивно:
ls -lR
-R — Рекурсивно выдавать список содержимого всех каталогов.
Подробнее о команде ls можно прочитать в статье «15 базовых примеров команды ls в Linux»
Поиск файлов
Search for files in a directory hierarchy
Поиск файлов, начинающихся на testf, с корневого каталога:
find / -name «testf*»
locate
Find files by name
Описание с официального сайта:
Команда updatedb создаёт индекс всех файлов и папок, имеющихся в системе. Команда locate позволяет быстро находить файлы в системе по этому индексу без необходимости сканирования всей файловой системы каждый раз. Также см. пакеты mlocate и slocate.
whereis
Locate the binary, source, and manual page files for a command
Команду удобно использовать для определения месторасположения исходных файлов, ман-страниц.
Информация о консольном редакторе nano:
whereis nano
which
Locate a command
Также прочитать подробнее о командах поиска можно в статье «5 способов поиска файлов в Linux, используя терминал.».
Другие команды
Помимо описанных выше существует множество других полезных команд, о которых можно прочитать ниже.
pwd — print name of current/working directory/
Очень полезная команда, которая наиболее часто используется вообще без каких-либо аргументов.
cd — используется для перехода между каталогами.
Для перехода в домашний каталог:
cd
Для перехода в каталог /usr/bin/:
cd /usr/bin/
Переход на один уровень вверх:
cd ..
ln — создает ссылки между файлами
du — оценка места на диске, занимаемого файлом
Вывести размер текущего каталога:
du -sh
-s — Выводить размеры только для указанных явно аргументов, а не для их подкаталогов.
-h — Добавлять букву размера, например M для двоичного мегабайта ( мебибайт’), к каждому размеру.
На этом пока все, по мере необходимости буду дополнять статью другими командами.
Помимо упомянутых выше, при написании статьи использовались следующие источники:
Источник