Как скопировать файлы, которые соответствуют элементам в списке?

Вопрос или проблема

Представьте, что у меня есть много файлов, имена которых имеют вид file#.tex (то есть file1.tex, file2.tex, …, file100.tex). Мне нужно скопировать только те файлы, номера которых # находятся в другом файле с именем chosen.txt, содержание которого, например, следующее:

2
3
4
14
26
99

То есть мне нужно скопировать в другую директорию только шесть файлов file#.txt, номера которых # находятся в списке выше.

Вы можете использовать

sed -E 's/.+/file&.tex/' chosen.txt | xargs echo cp -t /other/directory

Если это выдает команду cp, которая выглядит правильно, удалите “echo”

Ответ или решение

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

Что нужно сделать

У вас есть файлы с именами формата file#.tex, где # — это число от 1 до 100. Вам нужно скопировать только те файлы, номер которых содержится в файле chosen.txt, который выглядит так:

2
3
4
14
26
99

Цель состоит в том, чтобы скопировать упомянутые файлы в другую директорию, например /other/directory.

Решение при помощи командной строки

Мы можем воспользоваться комбинацией команд sed, xargs и cp, чтобы достичь этой цели. Ниже приведены шаги, которые необходимо следовать:

  1. Формирование команд копирования: Сначала мы получим из файла chosen.txt числа, которые соответствуют именам файлов.

  2. Копирование файлов: Сформируем команду, которая будет копировать необходимые файлы.

Вот сама команда, которая дает нам необходимый результат:

sed -E 's/.+/file&.tex/' chosen.txt | xargs -I {} cp {} /other/directory

Пояснение команды

  • sed -E 's/.+/file&.tex/' chosen.txt:

    • sed изменяет каждую строчку в файле chosen.txt, преобразуя ее в формат file#.tex. Символ & представляет собой текст, найденный в текущей строке, то есть число из chosen.txt. Таким образом, каждая строка становится именем файла.
  • xargs -I {}:

    • xargs берет выходные данные предыдущей команды и формирует новые команды. Опция -I {} позволяет нам использовать {} в качестве замены для каждого элемента, который мы получаем от sed.
  • cp {} /other/directory:

    • Эта часть выполняет копирование каждого файла из текущей рабочей директории в указанную папку /other/directory.

Обратите внимание

  • Проверка на существование файлов: Убедитесь, что файлы, которые вы хотите скопировать, действительно существуют в вашей текущей директории. Если, например, файла file99.tex нет, команда cp просто не выполнит операцию и выдаст предупреждение.

  • Удаление ‘echo’: Если вы видите команду cp перед исполнением, вы можете просто убрать echo, чтобы команда выполнилась.

Альтернативы

Если вы не находитесь на UNIX-подобной системе, вы можете воспользоваться языком программирования Python, чтобы реализовать аналогичную логику. Вот простой пример такого решения на Python:

import shutil

# Чтение списка номеров из chosen.txt
with open('chosen.txt') as f:
    numbers = f.read().splitlines()

# Копирование файлов
for number in numbers:
    filename = f"file{number}.tex"
    shutil.copy(filename, '/other/directory')

Заключение

Таким образом, вы можете эффективно скопировать необходимые файлы, основываясь на списке в chosen.txt, используя командную строку или программирование на Python. Следуя предложенным указаниям, вы сможете быстро и без усилий выполнить свою задачу. Обязательно протестируйте команду перед началом массового копирования, чтобы избежать непредвиденных ошибок.

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

Капча загружается...