6

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

Какие команды я должен использовать для этого из командной строки? Я полагаю, что cat , grep и touch (а может и xargs?) должен быть вовлечен в процесс, но после нескольких испытаний я все еще не могу найти правильный синтаксис.

Может ли кто-нибудь просветить меня об этом?

2 ответа2

9

Скажем, у вас есть list.txt вот так:

file 1
file 2
file 3

Вы можете достичь того, что вы хотите с:

while read FILE; do touch "${FILE} some string"; done < list.txt
7

Итак, у вас есть list файлов, который содержит:

this
that
the-other

и вы хотите создать для каждой строки в этом файле файл с именем, указанным в этой строке. Это довольно просто - если и только если каждая строка состоит только из одного слова:

cat list | xargs touch --

(-- говорит touch не пытаться анализировать что-либо после него в качестве аргумента; без него, если у вас есть имена файлов, такие как -this , ведущий - запутает прикосновение к мышлению 't', 'h', 'i' и 's' означают аргументы, а не части буквального имени файла, к которым нужно прикоснуться.)

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

for file in `cat list`; do touch -- $file-customtext; done

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

this-customtext
that-customtext
the-other-customtext

Вы можете, конечно, заменить «-customtext» на что угодно, и у вас также может быть префикс и суффикс; если бы вместо этого do touch -- some-$file-text , например, это сработало бы так же, и в результате были бы файлы с именем some-this-text & c.

Теперь предположим, что содержимое list не так просто, в частности, что оно содержит пробелы, несловесные символы или другие вещи, которые оболочка не будет интерпретировать должным образом. Если вы спросите трех человек, что они порекомендуют в этом случае, вы, вероятно, получите пять ответов; Я хакер Perl, поэтому мой ответ - Perl. В частности, давайте предположим, что list содержит:

This is the first line
of three (three?) lines
in the list file.

Я бы сделал так:

cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'

Который производит результирующие файлы:

custom This is the first line text
custom of three (three?) lines text
custom in the list file. text

Обычай текст в этом случае может быть все , что угодно, пробелы и все, до тех пор пока она не содержит ни " смутит touch , ни ' смутит perl в команде Perl $_ представляет содержимое данная строка из list , и пользовательский текст принадлежит либо до, либо после него, но в двойных кавычках. (Пользовательский текст вне двойных кавычек будет восприниматься на touch как отдельное имя файла, которое будет буквально создано, если в нем нет чего-то, что могло бы вызвать touch к ошибке.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .