Katakanlah saya memiliki file teks seperti:
john
george
james
stewert
dengan setiap nama pada baris terpisah.
Saya ingin membaca baris file teks ini dan membuat file teks untuk setiap nama, seperti: john.txt
, george.txt
dll
Bagaimana saya bisa melakukan ini di Bash?
command-line
bash
levato
sumber
sumber
Jawaban:
# 1 Menggunakan Bash +
touch
:while read line; [...]; done <in
: Ini berjalanread
sampairead
kembali dengan sendirinya1
, yang terjadi ketika ketika akhir file tercapai; input untukread
dibaca dari file yang disebutkanin
dalam direktori kerja saat ini alih-alih dari terminal karena<in
pengalihan;touch "$line.txt"
: Ini berjalantouch
pada nilai diperluas$line.txt
, yang merupakan kontenline
diikuti oleh.txt
;touch
akan membuat file jika tidak ada dan memperbarui waktu aksesnya jika ada;# 2 Menggunakan
xargs
+touch
:-a in
: membuatxargs
membaca inputnya dari file yang disebutkanin
dalam direktori kerja saat ini;-I name
: membuatxargs
ganti setiap kemunculanname
dengan jalur input saat ini dalam perintah berikut;touch name
: Berjalantouch
pada nilai yang diganti dariname
; itu akan membuat file jika tidak ada dan memperbarui waktu aksesnya jika ada;sumber
read line
sebenarnya akan membaca baris? @kos<in
setelahdone
merekread
diwhile
kondisi loop membaca dan menyimpan satu baris dariin
dalamline
pada setiap iterasi; dengan cara ini,touch "$line.txt"
di dalam loop akan diperluas ke baris baca dengan.txt
di akhir.while read line; do touch "$line.txt"; done <in
sendirian melakukan pekerjaan itu? Di mana file sumbernya?read
kerjanya. Lihathelp read
.Dalam kasus khusus ini, di mana Anda hanya memiliki satu kata per baris, Anda juga dapat melakukan:
Perhatikan bahwa ini akan pecah jika nama file Anda dapat berisi spasi. Untuk kasus seperti itu, gunakan ini sebagai gantinya:
Hanya untuk bersenang-senang, berikut adalah beberapa pendekatan lain (keduanya dapat menangani nama file yang berubah-ubah, termasuk baris dengan spasi):
Perl
Awk
Perhatikan bahwa pada Linux dan sistem serupa, ekstensi bersifat opsional untuk sebagian besar file. Tidak ada alasan untuk menambahkan
.txt
ekstensi ke file teks. Anda bebas untuk melakukannya tetapi tidak ada bedanya sama sekali. Jadi, jika Anda tetap menginginkan ekstensi, gunakan salah satu dari:sumber
AWK juga sesuai untuk tugas ini:
Cara lain
tee
,. Perhatikan bahwa pendekatan ini akan terputus jika sebuah baris berisi lebih dari satu string dalam daftar file.Atau,
</dev/null tee $(cat filelist)
bisa dilakukan juga, jika Anda ingin menghindari perpipaancp /dev/null
pendekatan (Seperti yang saya tunjukkan ini berfungsi dengan nama file yang berisi spasi):sumber
echo "" | tee file1 file2 file2
. Tapi itu pecah jika nama file mengandung spasi.Katakanlah, saya punya jawaban ;)
Tahan air juga dengan spasi dan akhiran =)
sumber