- Скопировать структуру папок без файлов linux
- Команда cp: правильное копирование папок с файлами в *nix
- Выводы
- Послесловие
- скопировать структуру каталогов с двумя требованиями
- Как копировать файлы и каталоги в Linux
- Копирование файлов с помощью команды cp
- Скопируйте файл в каталог
- Копировать несколько файлов
- Копирование каталогов с помощью команды cp
- Копирование файлов и каталогов с помощью команды rsync
- Выводы
Скопировать структуру папок без файлов linux
Собственно хочется скопировать на другой диск полную структуру одного каталога, в нем примерно тысяча подкаталогов. Собственно нужна только структура, файлики сами не нужны.
Есть ли какая команда?
Оглавление |
|
Индекс форумов | Темы | Пред. тема | След. тема |
Сообщения по теме |
1. «Как можно скопировать только структуру каталогов?» | |
Сообщение от Simps | |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
2. «Как можно скопировать только структуру каталогов?» | |
Сообщение от Дениска. | |
| |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
3. «Как можно скопировать только структуру каталогов?» | |
Сообщение от allez | |
find /where/to/search -type d | cpio -pvdm /where/to/copy | |
Удалить | Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх |
4. «Как можно скопировать только структуру каталогов?» | |
Сообщение от skv | |
СПАСИБО! все так и сделал, все ОК 🙂 Источник Команда cp: правильное копирование папок с файлами в *nixВ этой статье будут раскрыты некоторые неочевидные вещи связанные с использованием wildcards при копировании, неоднозначное поведение команды cp при копировании, а также способы позволяющие корректно копировать огромное количество файлов без пропусков и вылетов. Допустим нам нужно скопировать всё из папки /source в папку /target. Первое, что приходит на ум это: Сразу исправим эту команду на: Ключ -a добавит копирование всех аттрибутов, прав и добавит рекурсию. Когда не требуется точное воспроизведение прав достаточно ключа -r . После копирования мы обнаружим, что скопировались не все файлы — были проигнорированы файлы начинающиеся с точки типа: .profile Почему же так произошло? Потому что 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.
Чтобы обойти это вредное ограничение мы используем неочевидное решение: Те кто хорошо знаком с DOS и Linux уже всё поняли: внутри каждой папки есть 2 невидимые папки «.» и «..», являющиеся псевдопапками-ссылками на текущую и вышестоящие директории.
Итак, вешаем в жирную рамочку в своей памяти или на стене: Поведение этой команды однозначно. Всё отработает без ошибок вне зависимости от того миллион у вас файлов или их нет вовсе. ВыводыЕсли нужно скопировать все файлы из одной папки в другую, не используем wildcards, вместо них лучше использовать cp в сочетании с точкой в конце папки-источника. Это скопирует все файлы, включая скрытые и не завалится при миллионах файлов или полном отсутствии файлов. Послесловиеvmspike предложил аналогичный по результату вариант команды: ВНИМАНИЕ: регистр буквы T имеет значение. Если перепутать, то получите полную белиберду: направление копирования поменяется. Источник скопировать структуру каталогов с двумя требованиями
Как сделать сабж без использования грубой силы? 1. man find 2. man tar ломать не строить, так что копируй всё, удалить потом всегда успеется
Была всё-таки надежда, что я что-нибудь упустил из минимального набора команд. Это unix-way, без шуток. Без xargs — тогда find -exec tar -ac, например, и в файл. Или сохранить список в файл и tar -T $FILE_WITH_LIST Это гдеж вы будете все это дело прменять, что даже xargs нет и не поставить его? На тостере? Тогда почему бы не сделать это в нормальном окружении, а потом передать тостеру уже готовый результат? У гнутого tar’а работает —exclude=’*/*/*’, может подойдёт. если в совсем диком окружении, то проще нативный бинарник сваять, с или с++ в руки. tar -T —
Взмахнуть волшебной палочкой и сказать: «сделай мне А cp -a не отвечает этим требованиям? Не сомневаюсь. Но иногда использование конвейеров является следствием незнания каких-то возможностей известных команд. Тема была создана отчасти для того, чтобы развеять предположение о том, что я что-то упускаю.
В busybox. Можно сделать и в «нормальном окружении», но здесь тот случай, когда этого «нормального окружения» ещё нет.
Читайте выше. Всегда остаётся сомнение, что такой палочки не существует. Ведь если палочка действительно хороша, то лучше использовать её одну, чем собирать самому из не менее хороших, но многих. В целом, задача была из не особенно важных. Всем огромное спасибо за проявленный энтузиазм, особенно Источник Как копировать файлы и каталоги в LinuxКопирование файлов и каталогов — одна из наиболее распространенных задач, которые вы будете выполнять при работе в командной строке. В Linux есть несколько команд для копирования файлов, наиболее широко используемые инструменты — cp и rsync . Обычной практикой является использование команды cp для копирования файлов и rsync для копирования каталогов. Чтобы иметь возможность копировать файлы и каталоги, у вас должны быть как минимум права на чтение исходного файла и права записи в целевой каталог. Копирование файлов с помощью команды cpВ операционных системах Linux и Unix команда cp используется для копирования файлов и каталогов. Самый простой вариант использования — скопировать файл в текущий рабочий каталог. Например, чтобы скопировать файл с именем file.txt в файл с именем file_backup.txt в текущем каталоге , вы должны выполнить следующую команду: Если целевой файл существует, он будет перезаписан. Чтобы получить запрос на подтверждение перед перезаписью файлов, используйте параметр -i . По умолчанию при использовании команды cp для копирования файла новый файл будет принадлежать пользователю, выполняющему команду. Используйте параметр -p чтобы сохранить режим файла, владельца и временные метки : Другой вариант, который может быть полезен, — это -v . При использовании этой опции команда печатает, что делается: Скопируйте файл в каталогЧтобы скопировать файл в каталог, укажите абсолютный или относительный путь к каталогу. Если целевой каталог не указан, файл копируется в текущий каталог. В следующем примере мы file.txt файл file.txt в file.txt /backup : При указании в качестве места назначения только имени каталога скопированный файл будет иметь то же имя, что и исходный файл. Если вы хотите скопировать файл под другим именем, вам необходимо указать желаемое имя файла: Приведенная выше команда скопирует файл в указанный каталог как new_file.txt . Копировать несколько файловЧтобы скопировать сразу несколько файлов и каталогов, укажите имена исходных файлов и каталогов, за которыми следует каталог назначения в качестве последнего аргумента: При копировании нескольких файлов местом назначения должен быть каталог. Команда cp также позволяет использовать сопоставление с образцом. Например, чтобы скопировать все файлы .png из текущего каталога в каталог /backup , вы должны использовать: Копирование каталогов с помощью команды cpЧтобы скопировать каталог, включая все его файлы и подкаталоги, используйте параметр -R или -r . В следующем примере мы копируем каталог Pictures в Pictures_backup : Приведенная выше команда создаст каталог назначения и рекурсивно скопирует все файлы и подкаталоги из источника в каталог назначения. Если целевой каталог уже существует, сам исходный каталог и его содержимое копируются в целевой каталог. Чтобы скопировать только файлы и подкаталоги, но не целевой каталог, используйте параметр -T : Параметры, используемые при копировании файлов, также могут использоваться при копировании каталогов. Основное отличие состоит в том, что при копировании каталогов необходимо использовать параметр -R . Копирование файлов и каталогов с помощью команды rsyncrsync — это быстрая и универсальная утилита командной строки, которая синхронизирует файлы и каталоги между двумя местоположениями. Его можно использовать для копирования файлов в локальные и удаленные места. rsync включает множество параметров, которые контролируют каждый аспект его поведения. Наиболее полезная опция -a которая рекурсивно копирует каталоги, передает специальные и блочные устройства и сохраняет символические ссылки, время модификации, группу, владение и разрешения. Чтобы скопировать один файл из одного места в другое, вы должны выполнить следующую команду: Если целевой файл существует, rsync перезапишет его. Эту же команду можно использовать для копирования каталога: rsync по-разному rsync исходным каталогам, заканчивающимся косой чертой / . Если вы добавите завершающую косую черту в исходный каталог, команда скопирует только содержимое исходного каталога в целевой каталог. Если косая черта в конце опущена, rsync скопирует исходный каталог в целевой каталог. Самый безопасный вариант — всегда включать косую черту / как в месте назначения, так и в источнике. Чтобы узнать больше о rsync прочтите следующие статьи: ВыводыМы показали вам, как копировать файлы и каталоги в системах на базе Linux и Unix, используя утилиты cp и rsync . Если у вас есть вопросы, оставьте комментарий ниже. Источник |