Вопрос или проблема
Представьте, что у меня есть много файлов, имена которых имеют вид 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
, чтобы достичь этой цели. Ниже приведены шаги, которые необходимо следовать:
-
Формирование команд копирования: Сначала мы получим из файла
chosen.txt
числа, которые соответствуют именам файлов. -
Копирование файлов: Сформируем команду, которая будет копировать необходимые файлы.
Вот сама команда, которая дает нам необходимый результат:
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. Следуя предложенным указаниям, вы сможете быстро и без усилий выполнить свою задачу. Обязательно протестируйте команду перед началом массового копирования, чтобы избежать непредвиденных ошибок.