Итак, у вас есть 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
к ошибке.)