Как скопировать файлы с одинаковыми именами в одну и ту же папку bash
Обновлено: 21.11.2024
Копирование файла или папки означает создание нового файла с дублирующимся содержимым, как в существующем файле.
Иногда нам нужно скопировать файлы или папки, а не программу резервного копирования. Файлы можно копировать с тем же именем или изменить имя.
Копирование файла, папки или каталога — простая и основная задача в операционной системе Linux. Команды переименования, удаления или копирования используются в качестве повседневных операций при работе с интерфейсом командной строки.
Несмотря на то, что для копирования файлов существует несколько команд, команды «cp» и «rsync» являются широко используемыми простейшими подходами.
Как копировать файлы с помощью команды «cp» в Linux:
Команда «cp» — одна из наиболее часто используемых команд для выполнения операции копирования. С помощью этой команды вы можете копировать файлы или папки из источника в место назначения, то есть в один каталог.
Синтаксис команды «cp»:
Давайте рассмотрим пример, чтобы лучше понять инструмент команды «cp».
В домашнем каталоге создайте папку «temp» с текстовым файлом с именем «text_file1.txt» и добавьте в нее произвольное содержимое.
Скопируйте файл с тем же именем:
Чтобы скопировать каталог с файлом text_file1.txt с тем же именем, откройте терминал и введите указанную команду «cp» с правильным путем.
Получить путь к папке, щелкнув файл правой кнопкой мыши и перейти к параметру «Свойства» (это самый простой способ получить ссылку на путь).
Откроется диалоговое окно с полным путем к текстовому файлу:
Используйте этот путь с командой «cp» для копирования файла:
Эта команда скопирует файл «text_file1.txt» в папку «temp2».
Чтобы проверить это, введите команду «ls» в терминале:
Скопируйте файл с другим именем:
Чтобы скопировать файл в текущий рабочий каталог с другим именем, введите следующую команду «cp» с указанием местоположения файла:
Проверьте это с помощью команды «ls»:
Скопировать несколько файлов с помощью команды «cp»:
Чтобы скопировать несколько файлов с помощью команды «cp», перейдите в терминал в каталог, в котором сохранены файлы, а затем запустите команду «cp», указав имена файлов, которые вы хотите скопировать, и путь назначения.
$ cd/home/wardah/temp
$ cp text_file1.txt text_file2.txt text_file3.txt /home/wardah/temp2
Выполните указанную команду, чтобы проверить, успешно ли скопированы файлы:
Вышеупомянутые сценарии показывают, как скопировать один или выбранный файл в каталог. Теперь используйте подстановочный знак (*), чтобы скопировать имеющиеся файлы из одного каталога в любой другой конкретный каталог.
Проверим, как это работает:
Выполните команду «ls», чтобы проверить, сколько файлов существует во временном каталоге:
Вместо того, чтобы указывать все имена файлов в терминале, используйте подстановочный знак (*) с путем к каталогу, чтобы скопировать все файлы в место назначения:
Теперь снова запустите команду «ls», чтобы проверить, все ли файлы скопированы в каталог «temp2»:
Как копировать файлы с помощью команды «rsync» в Linux:
Команда rsync — еще один универсальный инструмент Linux для синхронизации и копирования файлов и каталогов как локально, так и удаленно.
Синтаксис команды «rsync» для копирования файлов:
Это встроенный инструмент во многих дистрибутивах Linux. Однако, если в вашей системе его нет, установите его, выполнив следующую команду:
Чтобы скопировать файл из одного места в другое, выполните следующую команду:
Для подтверждения введите:
Чтобы скопировать все файлы каталога в другое место, введите следующую команду:
(«-a» с командой «rsync» используется для рекурсивного копирования каталогов)
Вот две концепции:
Если вы добавите косую черту (/) в конце пути, содержимое исходного каталога будет скопировано в целевой каталог, как показано на рисунке:
Но если вы его не добавите, он скопирует исходный каталог в целевой каталог, например:
Приведенная выше команда скопирует каталог «dir1» в каталог «dir2».
Вывод:
Копирование файла или каталога — это основная команда, с которой можно работать. Его можно использовать несколько раз при использовании операционной системы Linux.
В этом руководстве рассмотрены два простейших подхода: команда «cp» и команда «rsync». С помощью этих команд мы научились копировать один файл, несколько файлов и даже копировать один каталог в другой.
Об авторе
Варда Батул
Я дипломированный инженер-программист и целеустремленный писатель Linux. Я также люблю читать последние книги по Linux. Кроме того, в свободное время я люблю читать книги по личностному развитию.
У меня есть большое количество папок с файлом genome.txt, который мне нужно скопировать в одну папку. Я пытаюсь понять, как мне сделать так, чтобы файлы выглядели как genome1.txt , genome2.txt и т. д. Я ищу простое решение для этого.
Добро пожаловать на сайт! Вам нужно решение или простое решение? Может быть сделано, но, пожалуйста, определите просто. Самое простое решение — скрипт. Пожалуйста, укажите, достаточно ли это для вас.
Это было бы идеально! Чем проще, тем лучше, но я достаточно знаком со сценариями, чтобы понять.
1 Ответ 1
Сценарий оболочки и его использование
Это можно сделать с помощью простого сценария оболочки, использующего find . |при чтении var ; делать . структура done (очень распространена при работе с именами файлов). Приведенный ниже сценарий bash работает с текущим (самым верхним) каталогом и принимает один аргумент в качестве места назначения.
Улучшение скрипта для большей гибкости
Этот сценарий можно улучшить, сделав его более общим, где пользователь может указать имя файла , верхний каталог для перехода и пункт назначения в качестве аргументов командной строки:
Синтаксис и теория работы
Повсюду в скрипте используется команда | пока читаем переменную ; делать . сделанная структура. Это очень распространенный подход, и его часто используют, чтобы избежать работы с ls и сложными именами файлов, которые могут нарушить работу скриптов.
Слева от канала у нас есть команда find, которая принимает каталог в качестве аргумента (и если это не указано, GNU find, который используется в Linux, предполагает . - текущий рабочий каталог). Другие параметры включают -name, которое является конкретным именем файла, который мы ищем, и -print0, которое используется для вывода результатов в виде разделителей с помощью непечатаемого символа \0. Он часто используется, чтобы избежать разбиения на новую строку или другие символы, поскольку эти символы потенциально могут появиться в самом имени файла и в результате нарушить сценарий.
На правой стороне канала у нас есть while IFS= read -r -d ''; делать . . . сделанная структура. Цикл while со встроенной оболочкой чтения часто используется для реального ввода stdin, который в данном случае поступает из конвейера. IFS= -r и -d '' необходимы для обеспечения безопасного получения имен файлов и распознавания того, что каждый элемент ограничен символом \0 .
Остальная часть скрипта довольно проста. Мы извлекаем базовое имя файла с помощью команды basename. Поскольку в данном случае мы имеем дело конкретно с известным расширением и ожидаем, что в имени файла будет одна точка, мы можем использовать --suffix=".txt" для удаления этой части, оставив часть генома. Затем мы создаем новый путь к файлу, объединяя адресат, базовое имя и переменную счетчика. Обратите внимание, что мы используем расширение параметра с аргументом «$» (целевая папка) в нашем улучшенном скрипте. Это сделано для того, чтобы гарантировать, что независимо от того, добавил ли пользователь символ / в командной строке ( ./destination или ./destination/ ), мы извлекаем только голое имя каталога и присоединяемся к нему через другое / с базовым именем.Обратите также внимание, что переменная счетчика изначально не задана, поэтому первое имя файла, которое мы получим, будет простым genome.txt. После этого переменная счетчика будет увеличена и, таким образом, создана и будет отображаться, когда мы будем иметь дело с другими именами файлов.
Я преобразовал PST-файлы с помощью библиотеки readpst в отдельные файлы .eml. После преобразования каждого из файлов pst я получил каталог с несколькими вложенными подкаталогами, и в каждом из этих каталогов и подкаталогов есть эти файлы .eml, пронумерованные от 1..n .
Проблема в том, что мне нужно, чтобы все они находились в одном каталоге, однако, когда я пытаюсь их переместить, например:
он находит имена с одинаковыми именами и заканчивается:
Кто-нибудь знает, как переместить файлы в один каталог и переименовать, чтобы они не конфликтовали?
Когда вы говорите, что файлы eml имеют номера 1..n, а затем хотите переместить их все в общий каталог, означает ли это, что имена файлов будут конфликтовать? Например, останется только один файл «1.eml»? Или все они имеют уникальный номер?
Здравствуйте, Джефф! Да, каждый из этих подкаталогов будет иметь номер 1..n, и да, будут коллизии, поскольку они не имеют уникального номера.
1 Ответ 1
Реализация cp GNU имеет параметр --backup=[CONTROL], который создает файлы с другими именами, если целевой файл уже существует. Формат немного уродлив, так как он использует символы тильды ('~') для разделения расширения резервной копии.
Полезный аргумент CONTROL в вашем случае может быть пронумерован:
Обратите внимание: поскольку я не знаю такой опции для mv , если вы выберете этот подход, позже вам придется удалить исходные файлы на отдельном шаге.
Одна проблема, которую я вижу в этом решении, заключается в том, что будет невозможно отличить, какой файл из какого каталога. РЕДАКТИРОВАТЬ: Хотя некоторые люди считают это поведение подходящим и является поведением браузеров по умолчанию, например, когда вы загружаете файлы с одинаковыми именами в один и тот же каталог несколько раз. Хотя расширение имени файла для этих «резервных копий» в этом случае другое, оно также пронумеровано.
Вместо описанного выше вы также можете встроить путь в каждое имя файла, например, изменив разделители косой черты на символы подчеркивания. Хотя результаты более информативны, вы можете получить очень длинные и некрасивые имена файлов, и есть много места для ошибок:
Кроме того, файлы, в которых на самом деле есть знаки подчеркивания, будут выглядеть странно, и может возникнуть двусмысленность, если компонент имени файла, разделенный символом подчеркивания, ранее был компонентом пути или нет.
Обратите внимание, что символ косой черты между '/path/to/outputdir' и командой, начинающейся с "$(echo "$filePath"" |., чрезвычайно важен!
Первое выражение sed предназначено для предотвращения создания скрытых файлов, если вершина дерева поиска, указанная для поиска, начинается с символа точки. Во-вторых, это просто замена косой черты в разделителе пути символами подчеркивания.
Это решение также не очень масштабируемо, так как вам, возможно, придется внести много изменений, если вы просто хотите изменить поисковый запрос, чтобы избежать резких результатов. Например, если поисковый запрос также включает каталоги, cp не будет обрабатывать эти строки. К счастью, в этом случае копирование просто не удается, и вы даже получаете сообщение в свой поток ошибок. Перезапись файлов в вашей файловой системе — это не шутки!
Это руководство покажет вам, как копировать файлы и каталоги в Linux, выполняя команды из командной строки. Кроме того, перечисленные ниже команды подробно описывают, как создавать общесистемные резервные копии или отфильтровывать и копировать только определенные файлы.
Примечание. Эти команды Linux можно запускать только из окна терминала. Если ваша версия Linux загружается с графическим интерфейсом рабочего стола, запустите окно терминала, нажав CTRL-ALT-F2 или CTRL-ALT-T.
Использование команды cp для копирования файлов и каталогов в Linux
Команда cp — это основной метод копирования файлов и каталогов в Linux. Практически все дистрибутивы Linux могут использовать cp. Основной формат команды:
Эта команда Linux создает копию файла my_file.txt и переименовывает новый файл в my_file2.txt.
По умолчанию команда cp запускается в том же каталоге, в котором вы работаете. Однако один и тот же файл не может существовать дважды в одном и том же каталоге. Вам нужно будет изменить имя целевого файла, чтобы скопировать его в то же место. Некоторые пользователи добавляют _old, некоторые добавляют номер, а некоторые даже меняют трехбуквенное расширение (например, .bak вместо .txt).
Возможно, вы не получите предупреждение до того, как Linux перезапишет ваш файл — будьте осторожны или см. ниже параметр –i.
Дополнительные параметры
В сочетании с командой cp можно использовать дополнительные параметры:
- –v verbose: показывает ход выполнения нескольких скопированных файлов
- –ppreserve: сохраняет те же атрибуты, такие как дата создания и права доступа к файлам.
- –f force: принудительно скопировать, предварительно удалив существующий файл
- –i интерактивный: запрашивает подтверждение, настоятельно рекомендуется
- –Рекурсивный: копирование всех файлов и подпапок в каталоге
- –u update: копировать, только если источник новее, чем место назначения
Примечание. Параметр -p (сохранить) заставляет систему сохранять следующие атрибуты исходного файла: время модификации, время доступа, идентификатор пользователя (UID), идентификатор группы (GID), флаги файла, режим файла, списки управления доступом. (ACL) и расширенные атрибуты (EA).
Как скопировать файл в другой каталог в Linux
Чтобы скопировать файл из каталога, в котором вы работаете, в другое место, используйте команду:
Вам не нужно переименовывать файл, если в целевом каталоге уже нет файла с таким именем.
Чтобы указать путь к исходному файлу:
Это позволяет копировать без изменения каталогов. Команда cp создаст каталог /new_directory, если он не существует.
Чтобы переименовать и скопировать файл по другому пути:
Этот параметр полезен для создания резервных копий файлов конфигурации или для копирования данных на устройство хранения.
Примечание. Узнайте, как перемещать каталоги в Linux.
Копировать несколько файлов из одного каталога в другой в Linux
Возможно, вам потребуется скопировать более одного файла за раз.
Перечислите все файлы, которые нужно скопировать, перед целевым каталогом:
В этом примере создаются копии всех трех файлов в папке /new_directory.
Используйте подстановочный знак, чтобы указать все файлы, которые имеют общую строку символов:
Это позволит найти все файлы с расширением .jpg в каталоге /pictures и скопировать их в папку /new_directory.
Чтобы скопировать всю папку, ее вложенные папки и файлы, используйте параметр –R:
–R означает рекурсивный, что означает «все в этом месте». Это скопирует все файлы, а также все каталоги в папку /new_directory.
Копировать с помощью команды rsync
Команда rsync в Linux используется для синхронизации или передачи данных между двумя местоположениями. Использование похоже на cp , но следует отметить несколько ключевых отличий.
Чтобы скопировать один файл, введите в терминал следующее:
- Опция –a означает все и включена в команды rsync — это сохраняет подкаталоги, символические ссылки и другие метаданные.
- Замените файл my_file.txt в рабочем каталоге.
- Замените /new_directory/ на место назначения.
- Использование my_file_backup.txt в качестве цели указывает, что файл будет переименован во время копирования.
Чтобы скопировать каталог с помощью rsync, введите следующее:
При этом содержимое каталога /etc/docker/ копируется в /home/backup/docker/. Обязательно сохраняйте косые черты. Если не указывать косую черту в исходном каталоге, содержимое будет скопировано в подкаталог.
Чтобы избежать копирования файлов, ознакомьтесь с нашим руководством о том, как исключить файлы и каталоги при передаче данных с помощью команды rsync.
Другие параметры
Команда ls является удобным партнером команды cp в Linux.
Чтобы просмотреть содержимое каталога, введите команду:
В приведенном выше примере отображаются все файлы в каталоге /. Используйте эту команду после копирования, чтобы убедиться, что файлы были скопированы успешно.
Чтобы изменить каталог, используйте cd и имя каталога. Например:
Командная строка изменится, чтобы показать, что вы изменили каталоги.
Теперь вы понимаете, как копировать файлы в Linux. Команда cp — это универсальный и мощный инструмент для управления файлами и их резервного копирования.
45, 0
У меня есть две папки. Папка A содержит более 1000 файлов, содержащих только изображения с именами типа:
и т. д. В папке B гораздо больше файлов, часть из них имеет то же имя, что и папка с файлами png, а другие нет. Вместо папки A, в которой находятся только изображения, это аудиофайлы в формате wav.
Мне нужно скопировать вторую папку только с файлами с тем же именем, но другим расширением. например, если в папке A у меня есть 01012015.jpg, а в папке B у меня есть 01012015.wav, просто скопировать вторые файлы в папку A, делать это вручную будет слишком долго.
Будем рады любой помощи.
2 019 606
Запустите это в командной строке с соответствующими изменениями:
rbatte1
3 843 841
- Список всех файлов за исключением .jpg в папке A в файл, скажем, /tmp/folderA.lst
- Список всех файлов кроме .wav в папке B в файл, скажем, /tmp/folderB.lst
Это даст соответствующий список, и вы сможете делать из него все, что требуется.
Это поможет вам начать?
45, 0
спасибо за ваше время. Я проверил еще раз, и имена другие. В папке A у меня есть 20150730_091113.wav-image.jpg , в другой папке у меня есть 20150730_091113.wav . Я пробовал использовать ваш метод, используя файлы *.lst, но они не совпадали с использованием grep -f . Может быть, я должен даже все имена или есть другое решение?
Заранее спасибо
Последний раз редактировалось rbatte1; 16.09.2015, 06:12 .. Причина: добавлены теги ICODE для имен файлов и команд
rbatte1
3 843 841
Как вы создали эти два файла? Вам нужно будет находиться в правильном каталоге, когда вы запускаете команду list.
Вы можете вставить образец двух сгенерированных файлов?
45, 0
сначала я переименовал изображения с помощью этого кода:
Итак, теперь у меня есть две папки. Папка A содержит файлы png с такими расширениями:
Я пробовал ваш метод создания файлов .lst с помощью этой команды:
и заканчивается на :
rbatte1
3 843 841
Что вы сделали, так это записали содержимое всех файлов в listA.lst и listB.lst соответственно, а не в список имен файлов.
В приведенном выше подходе используется сокращение, чтобы обрезать конец каждого имени файла, поэтому вы должны получить два файла, в которых перечислены общие части имен, которые вы хотите сравнить. Это предполагает, что в той части, которую вы хотите сравнить, нет файлов с точкой.
Использование команд grep затем выведет список общих (или отсутствующих) файлов, которые вас интересуют, и вы сможете создавать нужные команды в цикле, очевидно, добавляя обратно .jpg или .wav по мере необходимости.
Читайте также: