Copy files from one directory into an existing directory
How do I do this? I tried cp -r t1 t2 (both t1 and t2 are existing directories, t1 has files in it) but it created a directory called t1 inside t2, I don’t want that, I need the files in t1 to go directly inside t2. How do I do this?
Why was this closed? It is arbitrary if a bash command is a built-in or external command (e.g. printf exists as both on most systems), so cp questions can well be seen as bash questions, which is a programming language. I have never seen a Python question talking about file copy be closed.
I arrived in search of a reminder about the syntax of the Bash shell copy command, and I am happy to report that these commands seem also to work against the underlying NTFS filesystem on my Windows installation.
10 Answers 10
The dot at the end tells it to copy the contents of the current directory, not the directory itself. This method also includes hidden files and folders.
@CiroSantilli六四事件法轮功包卓轩 If you copy a directory, cp will create a directory and copy all the files into it. If you use the pretend folder called «.», which is the same as the directory holding it, the copy behaves this way. Let’s say t1 contains a file called «file». cp will perform the operation equivalent to «cp t1/./file t2/./». It is copying the folder «.», but copying files into t2’s «.» folder strips the «./» because «t2/./» is the same as «t2/». Technically, this means it’s POSIX built in behavior. but probably not in the way you might have been expecting!
once I tested using the source path trailing a dot (t1/.) it copied the entire t1 folder with its content into the t2 folder. So I got a t1 folder inside the t2 folder. But once I used * instead of dot it did work and copied only the content of t1 into t2. So I think the best answer to this question is the following script -> cp -R t1/* t2/
Or if you have directories inside dir1 that you’d want to copy as well
Depending on how your shell is configured, you’ll probably need to use «dir1/* dir1/.*» instead of «dir1/*» if you want to also catch hidden files.
Copying dir1/.* is not a good idea, as it copies dir1/.. (i.e. the parent of the directory you’re actually trying to copy). It also copies dir1/. which is fine, except that it’s already (mostly) been copied, so you’re doing the work twice.
You can get around the dir1/.* /hidden files problem by cd-ing into the directory you want to copy from, and then referring to it as . . So, if you want to copy all files including hidden files from a directory into an existing directory, you can: cd [source dir] , cp . [path to destination dir, with no trailing slash] .
If you want to copy something from one directory into the current directory, do this:
This assumes you’re not trying to copy hidden files.
Assuming t1 is the folder with files in it, and t2 is the empty directory. What you want is something like this:
Bear in mind, for the first example, t1 and t2 have to be the full paths, or relative paths (based on where you are). If you want, you can navigate to the empty folder (t2) and do this:
Or you can navigate to the folder with files (t1) and do this:
Note: The * sign (or wildcard) stands for all files and folders. The -R flag means recursively (everything inside everything).
The trailing slash on the source directory changes the semantics slightly, so it copies the contents but not the directory itself. It also avoids the problems with globbing and invisible files that Bertrand’s answer has (copying t1/* misses invisible files, copying `t1/* t1/.*’ copies t1/. and t1/. which you don’t want).
Your solution does not work, at least not on my installation (ubuntu 12.10) $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (sorry no codeformat in comments, readable version at pastebin.com/yszSxV6G)
For inside some directory, this will be use full as it copy all contents from «folder1» to new directory «folder2» inside some directory.
$(pwd) will get path for current directory.
Notice the dot (.) after folder1 to get all contents inside folder1
cp -r $(pwd)/folder1/. $(pwd)/folder2
Nov, 2021 Update:
This code with Flag «-R» copies perfectly all the contents of «folder1» to existing «folder2»:
Flag «-R» copies symbolic links as well but Flag «-r» skips symbolic links so Flag «-R» is better than Flag «-r».
-R, --dereference-recursive For each directory operand, read and process all files in that directory, recursively, following all symbolic links.
-r, --recursive For each directory operand, read and process all files in that directory, recursively. Follow symbolic links on the command line, but skip symlinks that are encountered recursively. Note that if no file operand is given, grep searches the working directory. This is the same as the ‘--directories=recurse’ option.
Bash скрипт резервного копирования директорий системы Linux
Одним из самых простых способов резервного копирования системы является использование сценария оболочки. Например, с помощью сценария можно настроить, какие каталоги следует резервировать, и передать эти каталоги в качестве аргументов утилите tar, которая создает архивный файл. Затем архивный файл можно переместить или скопировать в другое место. Архив также может быть создан на удаленной файловой системе, например, на монтируемой системе NFS.
Утилита tar создает один архивный файл из многих файлов или каталогов. tar также может фильтровать файлы с помощью утилит сжатия, тем самым уменьшая размер архивного файла.
Простой сценарий оболочки
Следующий сценарий оболочки использует tar для создания архивного файла на удаленно смонтированной файловой системе NFS. Имя архивного файла определяется с помощью дополнительных утилит командной строки.
#!/bin/bash #################################### # Резервное копирование в NFS. #################################### # Что нужно копировать. backup_files="/home /var/spool/mail /etc /root /boot /opt" # Куда создать резервную копию. dest="/mnt/backup" # Создание имя файла архива. day=$(date +%A) hostname=$(hostname -s) archive_file="$hostname-$day.tgz" # Выведите сообщение о состоянии запуска. echo "Backing up $backup_files to $dest/$archive_file" date echo # Резервное копирование файлов с помощью tar. tar czf $dest/$archive_file $backup_files # Выведите сообщение о завершении работы. echo echo "Backup finished" date # Длинный список файлов в $dest для проверки размеров файлов. ls -lh $dest
- $backup_files: переменная, в которой перечислены каталоги, резервные копии которых вы хотите создать. Список должен быть настроен в соответствии с вашими потребностями.
- $day: переменная, содержащая день недели (понедельник, вторник, среда и т.д.). Это используется для создания архивного файла для каждого дня недели, что дает историю резервного копирования за семь дней. Есть и другие способы добиться этого, включая использование утилиты date.
- $hostname: переменная, содержащая короткое имя хоста системы. Использование имени хоста в имени архивного файла дает возможность размещать ежедневные архивные файлы из нескольких систем в одном каталоге.
- $archive_file: полное имя архивного файла.
- $dest: место назначения архивного файла. Каталог должен быть создан и в данном случае смонтирован перед выполнением сценария резервного копирования. Подробности использования NFS см. в разделе .
- сообщения о состоянии: необязательные сообщения, выводимые на консоль с помощью утилиты echo.
- tar czf $dest/$archive_file $backup_files: команда tar, используемая для создания архивного файла.
- c: создает архив.
- z: фильтрация архива через утилиту gzip, сжимающую архив.
- f: вывод в архивный файл. В противном случае вывод tar будет отправлен в STDOUT.
Это простой пример сценария оболочки резервного копирования; однако существует множество опций, которые можно включить в такой сценарий.
Выполнение сценария
Выполнение из терминала
Самый простой способ выполнения приведенного выше сценария резервного копирования — скопировать и вставить его содержимое в файл. Например, backup.sh. Файл необходимо сделать исполняемым:
Затем из приглашения терминала:
Это отличный способ протестировать сценарий, чтобы убедиться, что все работает так, как ожидалось.
Выполнение с помощью cron
Для автоматизации выполнения скрипта можно использовать утилиту cron. Демон cron позволяет выполнять скрипты или команды в указанное время и дату.
cron настраивается с помощью записей в файле crontab. файлы crontab разделены на поля:
- m: минута, в течение которой выполняется команда, от 0 до 59.
- h: час, в который выполняется команда, от 0 до 23.
- dom: день месяца, в который выполняется команда.
- mon: месяц, в котором выполняется команда, от 1 до 12.
- dow: день недели, в который выполняется команда, от 0 до 7. Воскресенье может быть указано с помощью 0 или 7, оба значения действительны.
- command: команда для выполнения.
Для добавления или изменения записей в файле crontab следует использовать команду crontab -e. Кроме того, содержимое файла crontab можно просмотреть с помощью команды crontab -l.
Чтобы выполнить приведенный выше сценарий backup.sh с помощью cron. Введите в терминале следующую команду:
Использование sudo с командой crontab -e редактирует кронтаб пользователя root. Это необходимо, если вы создаете резервные копии каталогов, доступ к которым имеет только пользователь root.
Добавьте следующую запись в файл crontab:
0 0 * * * bash /usr/local/bin/backup.sh
Теперь сценарий backup.sh будет выполняться каждый день в 12:00 дня.
Сценарий backup.sh необходимо скопировать в каталог /usr/local/bin/, чтобы эта запись выполнялась правильно. Сценарий может находиться в любом месте файловой системы, просто измените путь к сценарию соответствующим образом.
Восстановление из архива
После создания архива важно протестировать его. Архив можно протестировать, перечислив содержащиеся в нем файлы, но лучшим тестом будет восстановление файла из архива.
Чтобы просмотреть список содержимого архива. В терминале введите:
tar -tzvf /mnt/backup/host-Monday.tgz
Чтобы восстановить файл из архива в другой каталог, введите:
tar -xzvf /mnt/backup/host-Monday.tgz -C /tmp etc/hosts
Опция -C в tar перенаправляет извлеченные файлы в указанный каталог. В приведенном выше примере файл /etc/hosts будет извлечен в /tmp/etc/hosts. tar воссоздает структуру каталогов, в которых он находится.
Также обратите внимание, что в пути к восстанавливаемому файлу отсутствует лидирующий символ «/».
Чтобы восстановить все файлы в архиве, выполните следующие действия:
cd / sudo tar -xzvf /mnt/backup/host-Monday.tgz
Это приведет к перезаписи файлов, находящихся в настоящее время в файловой системе.
Похожие записи: