Linux скопировать файлы старше одного дня

Обновлено: 03.07.2024

Задачу решил следующими костылями:

скрипт 1 - перенос всех файлов старше N дней:

После переноса файлов, структура каталогов в папке-источнике сохраняется.
Т.к. в этой папке и всех её подпапках были изображения, то так же в папке был скрытый файл Thumbs.db. Автоматически его удалить не получилось, ни powershell, ни vbs, ни cmd не смогли удалить их, по этому удалил их через поиск.

скрипт 2 - удаление всех пустых каталогов:

Автоматически его удалить не получилось, ни powershell, ни vbs, ни cmd не смогли удалить их »
Поставьте в скрипт команду сброса атрибутов -r, -h, -s для всех (чтобы не мудрствовать лукаво) файлов. После этого удаление пойдёт.
Поставьте в скрипт команду сброса атрибутов -r, -h, -s для всех (чтобы не мудрствовать лукаво) файлов. После этого удаление пойдёт. »
можно поточнее о какой команде и для какого языка идет речь? буду очень признателен.
можно поточнее о какой команде и для какого языка идет речь? »

В любом языке обязана быть команда работы с атрибутами файла (r, т.е. read only; s, т.е. system, h, т.е. hidden -- ну и непринципиальный (как правило) a): их сброс и установка. Даже в DOS-3 была (и до сих пор существует в cmd.exe и может быть использована в командных и пакетных файлах), например attrib -r <имя_файла> -- сброс атрибута rеad-only ("только для чтения") у файла, attrib +s <имя_файла> -- установка атрибута system ("системный"), attrib -s -h -r <имя_файла> -- одновременный сброс атрибутов "Системный", "Скрытый", "Только для чтения".

Поэтому я и дал чисто общую рекомендацию: надо смотреть, как это конкретно реализуется в языке, который вы используете.

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

Копирование файлов - одна из задач, наиболее часто возникающих перед пользователями персонального компьютера. Конечно, можно открыть файловый менеджер, войти в нужную папку и скопировать файл с помощью контекстного меню - тут не о чем говорить. Но в этой статье я хотел бы рассмотреть копирование файлов в Linux с помощью терминала.

Не всегда есть доступ к файловому менеджеру: из-за различных поломок графическая оболочка на домашнем компьютере может быть недоступна, а на серверах используется только консольный интерфейс. К тому же копирование файлов Ubuntu через терминал намного эффективнее, и вы сами в этом убедитесь. Сегодня мы рассмотрим не только обычное копирование командой cp Linux, но и не совсем обычное: с помощью tar и find.

Утилита копирования файлов cp

Название утилиты cp - это сокращение от Copy, что означает копировать. Утилита позволяет полностью копировать файлы и директории.

Синтаксис и опции

Общий синтаксис cp выглядит вот так:

$ cp опции файл-источник файл-приемник

$ cp опции файл-источник директория-приемник/

После выполнения команды файл-источник будет полностью перенесен в файл-приемник. Если в конце указан слэш, файл будет записан в заданную директорию с оригинальным именем.

Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:

  • --attributes-only - не копировать содержимое файла, а только флаги доступа и владельца;
  • -f, --force - перезаписывать существующие файлы;
  • -i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы;
  • -L - копировать не символические ссылки, а то, на что они указывают;
  • -n - не перезаписывать существующие файлы;
  • -P - не следовать символическим ссылкам;
  • -r - копировать папку Linux рекурсивно;
  • -s - не выполнять копирование файлов в Linux, а создавать символические ссылки;
  • -u - скопировать файл, только если он был изменён;
  • -x - не выходить за пределы этой файловой системы;
  • -p - сохранять владельца, временные метки и флаги доступа при копировании;
  • -t - считать файл-приемник директорией и копировать файл-источник в эту директорию.

Примеры копирования файлов в linux

Теперь, когда вы знаете основные опции, можно перейти к практике. Например, мы хотим скопировать некую картинку из домашней папки в подкаталог pictures:

Или можем явно указать имя новой картинки:

Копирование папок осуществляется с помощью ключа -r:

После выполнения этой команды копирования

/папка будет скопирована в папку

/Документы. Главное, не забывайте поставить слэш в конце выражения или использовать опцию -t. Иначе папка

/документы будет перезаписана.

По умолчанию команда cp Linux перезаписывает существующие файлы или папки, но можно заставить утилиту спрашивать, нужно ли перезаписывать каждый файл, если вы не уверены в правильности составления команды:

Есть и противоположная опция -n, означающая "никогда не перезаписывать существующие файлы".

Опция -u полезна в следующем случае: вы знаете или предполагаете, что в директории, куда копируется файл, есть старая его версия, тогда оператор -u выполнит замену на новую версию:

Сp также поддерживает специальные символы замены * и ?. Например, следующая команда скопирует все файлы, начинающиеся на test:

Если нужно применить более сложные регулярные выражения, придётся комбинировать утилиту cp с find или egrep.

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

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

Будет создан файл с таким же именем и расширением .bak

По умолчанию в cp не отображается прогресс копирования файла, что очень неудобно при работе с большими файлами, но его можно легко посмотреть с помощью утилиты cv.

Копирование файлов по регулярным выражениям в Linux

В утилите find можно применять различные условия и регулярные выражения для поиска файлов. Я уже немного писал о ней в статье как найти новые файлы в Linux. Мы можем скопировать все найденные с помощью find файлы, вызвав для каждого из них команду cp. Например, копируем все файлы в текущей директории, содержащие в имени только цифры:

find . -name 7 -exec cp <>

Здесь точка указывает на текущую директорию, а параметр name задает регулярное выражение. Параметром exec мы задаем, какую команду нужно выполнить для обнаруженных файлов. Символ <> - подставляет имя каждого файла.

Но не find'ом единым такое делается. То же самое можно получить, запросив список файлов директории в ls, отфильтровав его по регулярному выражению egrep и передав имена файлов по очереди в cp с помощью xargs:

/ | egrep '[a-zA-Z]' | xargs cp -t

Это не совсем удобный способ копировать файлы Linux, но всё же он возможен. Будут скопированы все файлы из домашней директории, содержащие в имени только английские буквы.

Копирование содержимого файлов в Linux

Вы можете не только копировать сами файлы, но и управлять их содержимым. Например, склеить несколько файлов в один или разрезать файл на несколько частей. Утилита cat используется для вывода содержимого файла, в комбинации с операторами перенаправления вывода Bash вы можете выполнять копирование содержимого файла Linux в другой файл. Например:

cat файл1 > файл2

Если файл был не пустым, он будет перезаписан. Или мы можем склеить два отдельных файла в один:

cat файл1 файл2 > файл3

Специальное копирование файлов в Linux с помощью tar

Linux интересен тем, что позволяет выполнять одно и то же действие различными путями. Копирование в Linux тоже может быть выполнено не только с помощью cp. При переносе системных файлов в другой каталог, резервном копировании системных файлов и т.д. важно чтобы сохранились атрибуты, значения владельцев файлов и символические ссылки как они есть без какой-либо модификации.

tar cf - /var | ( cd /mnt/var && tar xvf - )

Здесь мы полностью копируем содержимое папки /var в папку /mnt/var. Так вы можете копировать папку Linux, причём абсолютно любую или даже целую операционную систему.

Выводы

Теперь вы знаете, как выполняется копирование файлов Ubuntu и в Linux в целом. Как видите, в терминале это выполняется намного быстрее и эффективнее, чем с помощью графического интерфейса, если помнить нужные команды. Если у вас остались вопросы, спрашивайте в комментариях!

Необходимо чтоб все файлы и папки копировались из Ресурс 1 на Ресурс 2, но по дате, не позднее, чем три дня. При этом, чтоб с Русерс 1 эти файлы и папки удалялись.

Например. Сегодня понедельник. Нужно чтоб все файлы и папки в пятницу перенеслись с Ресурс 1 на Ресурс 2, но по дате, только за понедельник, вторник и среда.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Копирование файлов в зависимости от даты по FPT
Добрый день помогите пожалуйста в написании bat должен он уметь: 1. есть папки их 10 с разными.

Копирование файлов не ранее указанной даты
Какие команды использовать в терминале Linux чтобы ввести дату и скопировать файлы, созданные не.


Копирование файлов с указанием даты и времени
Здравствуйте. Стоит задача сделать бекап файлов, имя папки с бекапом должно быть в формате.

Копирование файлов в нужные папки в зависимости от их имён
Подскажите, пожалуйста. Можно ли реализовать такую функцию? Есть файлы вида XXX123456789 (цифры.

Разница между понедельником и пятницей, если не ошибаюсь, составляет 4 дня. Не совсем важно сколько дней между ними, это Я для примера. Смысл в том, что есть FTP с ограниченным местом. Каждую пятницу нужно очищать, но свежие файлы нужно оставлять, если думать как Вы, то да, это 4-х дневной давности.

FORFILES [/P <путь>] [/M <маска_поиска>] [/S] [/C <команда>] [/D [+ | -] ]

Параметры
/P <путь>
Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)
/M <маска_поиска>
Поиск файлов с помощью маски. Маска поиска по умолчанию "*"
/S
Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"
/C <команда>
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file".
Следующие переменные могут использоваться в строке команды:
@file возвращает имя файла
@fname возвращает имя файла без расширения
@ext возвращает только расширение имени файла
@path возвращает полный путь к файлу
@relpath возвращает относительный путь к файлу
@isdir возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов
@fsize возвращает размер файла в байтах
@fdate возвращает дату последнего изменения файла
@ftime возвращает время последнего изменения файла

Сегодня пора познакомиться с такими не менее важными операциями копирование, перемещение, переименование и удаление файлов и директорий, создание новых директорий. Данные операции являются основными.

Если быть совсем откровенным, то некоторые из этих задач проще выполнить при помощи файлового менеджера в графическом интерфейсе. Например, перемещение и копирование файла или директории выполняются простым перетаскиванием значка из одной области (директории) в другую. Тогда возникает вопрос, а в чем необходимость напрягаться с командной строкой? Разумеется, в огромном потенциале и гибкости.

С помощью графического интерфейса действительно проще выполнять простые операции с файлами. Но, как только нужно выполнить что-либо чуть сложнее, на помощь приходит Linux Shell 😉 Например, нам необходимо скопировать все фотографии из одной директории (с фотоаппарата) в другую, но только те, которых там нет (только те, что еще не скачали на компьютер). А если копируемый файл уже присутствует в директории, куда мы пытаемся его скопировать, но его нужно заменить, но лишь при условии, что копируемый файл наиболее свежий (например, заменить оригинал на ретушь, но не наоборот). Слишком сложно в графическом интерфейсе. Слишком просто в командной строке.

Разморозим виртуальную машину. Очень важно помимо чтения данного материала испытывать его в действии. А еще лучше, пытаться ставить опыты изменяя имена файлов или директории. Так можно будет быстрее заложить базовые команды в память рук, освободив головной мозг для более сложных задач. Достаточно вспомнить любую пешую прогулку. Мы можем о чем-то задумываться, продумывать путь, но никак не думаем о движении своих ног 🙂

Подстановки

Прежде чем перейти к самим командам, которые достаточно примитивны, поговорим немного о шаблонах, делающих команды достаточно удобными. В интерфейсе командной строки очень часто используются имена файлов, поэтому для быстрого обращения к группам файлов существуют специальные символы. Они называются подстановками и позволяют выбирать файлы по шаблонам символов. Посмотрим на наиболее частые.

* Соответствует любой подстроке символов, включая пустой строке. ? Соответствует любому символу. Присутствие символа обязательно (не соответствует пустой строке). [символы] Соответствует любому символу из указанного набора символы. Набор символов может быть обозначен классом символов POSIX: [:alnum:] — любая буква или цифра, [:alpha:] — любая буква, [:digit:] — любая цифра, [:upper:] — любая буква в верхнем регистре, [:lower:] — любая буква в нижнем регистре. [!символы] Соответствует любому символу, который отсутствует в указанном наборе символы.

При помощи подстановок можно составить очень сложные критерии выборки файлов. Рассмотрим несколько примеров.

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

Если быть более честным, то эти подстановки являются обычным развертыванием строк. Команда даже не видит сам шаблон подстановки, к ней поступает список файлов. Но это уже материал из будущего 🙂

Создание директории

Для создания новой директории можно воспользоваться командой mkdir. После имени команды через пробел нужно указать имена создаваемых директорий (для создания в рабочей директории) или пути к ним. Попробуем создать директорию test и перейдем в нее.

Читайте также: