3.66666666666671111111111Rating 3.67 (3 Votes)

Да это же просто, скажете Вы, но на этот комментарий есть несколько вариантов, которые могут быть достаточно не тривиальными, на вскидку - скопировать папку за исключением какого-то типа файлов или скопировать папку + сохранить настройки разрешений или скопировать из папки файлы только определенного типа...

Таких ситуаций в жизни админа может быть множество и в различных вариациях. Ниже немного разберем ряд команд, которые помогут в решении простых и не очень вопросов. Расскажу кратко, почему кратко - есть множество различных вариаций на тему копирования и ситуаций связанных с ним, ниже изложу основные, простые вещи из часто-употребляемых.

Команда CP

Здесь все просто есть команда cp, параметры и аргументы, если кратко:

cp [OPTION] Source Destination
cp [OPTION] Source-1 Source-2 Source-3 Source-n Directory

Копирование файлов

cp file1 file2 file3 Destination

Понятно, что ряд файлов копируется в папку с именем "Destination".

Копирование каталогов

Так как каталог содержит файлы, то нужно использовать рекурсивное копирование:

cp -R Src-Directory Dest-Directory

Копирование с заменой / без замены

Достаточно пустить через пайп:

yes | cp -R Src-Directory Dest-Directory

Или через force:

cp -Rf Src-Directory Dest-Directory

Без замены (предотвратить замену) можно использовать параметр -n:

cp -Rn Src-Directory Dest-Directory

Копирование определенного типа файлов

Достаточно выбрать файлы по расширению:

cp *.log Dest-Directory

Можно во всех случаях использовать verbose:

cp -Rv * /home/user/folder

Все доступные команды доступны в мане, основных параметров не так много, можно достаточно быстро изучить:

  • cp -a archive files
  • cp -f force copy by removing the destination file if needed
  • cp -i interactive - ask before overwrite
  • cp -l link files instead of copy
  • cp -L follow symbolic links
  • cp -n no file overwrite
  • cp -R recursive copy (including hidden files)
  • cp -u update - copy when source is newer than dest
  • cp -v verbose - print informative messages 

Но вопросы про разрешения и исключение файлов остаются открытыми, здесь придет на помощь rsync.

Копировать каталоги за исключением

Можно так:

rsync -r --exclude '.git' source target 

Каждое исключение - отдельный параметр, например так:

rsync -av --progress --exclude '.git' --exclude 'dir1' source target

Копировать каталоги сохранив разрешения

Здесь все просто, достаточно добавить параметр -p:

rsync -avp --progress source target

rcync обычно применяется при процедурах по резервному копированию файлов, при синхронизации каталогов, репозиториев и т.п., очень полезная вещь, но ман на много больше, чем у cp :D

Копирование с использованием FIND

Можно найти нужные файлы и скопировать их "куда надо":

find . -iname '*.mp3' -exec cp {} /my/destination/folder/ \;

Или так:

find /source/folder/ -name '*data*.xml' -exec cp {} /my/destination/folder/ \;

Поиск и копирование старых файлов 

Например сроком жизни более месяца:

find /var/log -type f -mtime +31 -exec cp '{}' /old/log/ \;

Памятка по Find

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

find <путь> <условия поиска> | xargs cp -t <куда копировать>

Но в целом подходит конструкция указанная выше:

find <путь> <условия поиска> -exec cp '{}' <куда копировать> \;

 

Добавить комментарий


Защитный код
Обновить

Сейчас 332 гостей и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз