Допустим, у меня есть текстовый файл, например:
john
george
james
stewert
с каждым именем в отдельной строке.
Я хочу прочитать строки этого текстового файла и создать текстовый файл для каждого имени, например: john.txt
, george.txt
и т. Д.
Как я могу сделать это в Bash?
touch
:while read line; do touch "$line.txt"; done <in
while read line; [...]; done <in
: Это работает read
до read
самостоятельно возвраты 1
, который происходит когда, когда конец файла достигнут; вход для read
читается из названного файла in
в текущем рабочем каталоге вместо от терминала из-за <in
перенаправление;touch "$line.txt"
: Это работает touch
на расширенном значении $line.txt
, который является содержанием line
сопровождаемый .txt
; touch
создаст файл, если не существующий и обновят его время доступа если существующий;xargs
+ touch
:xargs -a in -I name touch name.txt
-a in
: делает xargs
считайте его вход из названного файла in
в текущем рабочем каталоге;-I name
: делает xargs
замените каждое происшествие name
с текущей строкой входа в следующей команде;touch name
: Выполнения touch
на замененном значении name
; это создаст файл, если не существующий и обновят его время доступа если существующий;% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt in james.txt john.txt stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt in james.txt john.txt stewert.txt
В данном случае, где у Вас только есть отдельное слово на строку, можно также сделать:
xargs touch < file
Обратите внимание, что это повредится, если Ваши имена файлов могут содержать пробелы. Для таких случаев используйте это вместо этого:
xargs -I {} touch {} < file
Только для забавы, вот несколько других подходов (оба из которых могут обработать произвольные имена файлов, включая строки с пробелами):
Perl
perl -ne '`touch "$_"`' file
Awk
awk '{printf "" > $0}' file
Обратите внимание, что на Linux и аналогичных системах, расширение является дополнительным для подавляющего большинства файлов. Нет никакой причины добавить a .txt
расширение текстового файла. Вы свободны сделать так, но это не имеет никакого значения вообще. Так, если Вы хотите расширение так или иначе, используйте один из:
xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file
apt-get install gcc-multilib
... зафиксировал его для меня.
– Erik Aronesty
7 August 2018 в 08:56
Скажем, у меня есть текстовый файл …
Скажем, у меня есть ответ ;)
awk '{system("touch \""$0".txt\"")}' file
Водонепроницаемый также с пробелами и с суффиксом =)
AWK также подходит для этой задачи:
testerdir:$ awk '{system("touch "$0)}' filelist
testerdir:$ ls
filelist george james john stewert
testerdir:$ awk '{system("touch "$0".txt")}' filelist
testerdir:$ ls
filelist george.txt james.txt john.txt stewert.txt
george james john stewert
Иначе, tee
. Заметьте, что этот подход повредится, если строка будет содержать больше чем одну строку в списке файлов.
testerdir:$ echo "" | tee $(cat filelist)
testerdir:$ ls
filelist george james john stewert
С другой стороны, </dev/null tee $(cat filelist)
может быть сделан также, если Вы не хотите передавать по каналу
cp /dev/null
подход (Поскольку я демонстрирую это, действительно работает с именами файлов, которые содержат пробелы):
testerdir:$ cat filelist | xargs -I {} cp /dev/null "{}"
testerdir:$ ls
filelist FILE WITH SPACES george james john stewert
testerdir:$ ls FILE\ WITH\ SPACES
FILE WITH SPACES
dpkg -l package libc6-x32:i386 ... ii libc6-x32:i386 2.24-3ubuntu i386 GNU C Library: X32 ABI Shared lib
, но та же проблема:isa@isa-mini-PC:~$ ldd /home/isa/Downloads/temp/Linux/Fusion/Fusion not a dynamic executable
– Isag 14 February 2017 в 16:08