Diyelim ki bir metin dosyası var:
john
george
james
stewert
Her isim ayrı bir satırda.
Bu metin dosyasının satırları okuyup gibi her isim için bir metin dosyası oluşturmak istiyorum: john.txt
, george.txt
vb
Bash'te bunu nasıl yapabilirim?
Diyelim ki bir metin dosyası var:
john
george
james
stewert
Her isim ayrı bir satırda.
Bu metin dosyasının satırları okuyup gibi her isim için bir metin dosyası oluşturmak istiyorum: john.txt
, george.txt
vb
Bash'te bunu nasıl yapabilirim?
Yanıtlar:
touch
:while read line; do touch "$line.txt"; done <in
while read line; [...]; done <in
: Bu , dosyanın sonuna ulaşıldığında gerçekleşen kendi başına dönene read
kadar çalışır ; girişi , yönlendirme nedeniyle terminalden ziyade geçerli çalışma dizininde adı verilen bir dosyadan okunur ;read
1
read
in
<in
touch "$line.txt"
: Bu, touch
değeri izleyen ve $line.txt
bunun içeriği olan genişletilmiş değer üzerinde çalışır ; eğer mevcut değilse dosyayı oluşturacak ve eğer varsa erişim zamanını güncelleyecektir;line
.txt
touch
xargs
+ kullanarak touch
:xargs -a in -I name touch name.txt
-a in
: mevcut çalışma dizinindeki xargs
bir dosyadan girişini okur in
;-I name
: Aşağıdaki komutta, mevcut giriş satırının xargs
her oluşumunu değiştirir name
;touch name
: touch
Değiştirilen değeri üzerinde çalışır name
; mevcut değilse dosyayı oluşturur ve mevcutsa erişim zamanını günceller;% 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
read line
satırı nasıl okuyacak? @kos
<in
sonra done
yapar read
içinde while
döngü durumu okumak ve depolamasına bir satır in
içinde line
her tekrarda; Bu şekilde, touch "$line.txt"
ilmek iç .txt
kısmı sonda ile okuma çizgisine genişletilecektir .
while read line; do touch "$line.txt"; done <in
yalnız iş yapmak? Kaynak dosya nerede?
read
çalışır. Bakın help read
.
Her satırda yalnızca tek bir kelimeye sahip olduğunuz bu durumda, şunları da yapabilirsiniz:
xargs touch < file
Dosya adlarınız boşluk içeriyorsa, bunun kırılacağını unutmayın. Bu gibi durumlarda, bunun yerine bunu kullanın:
xargs -I {} touch {} < file
Sadece eğlence için, işte bir kaç başka yaklaşım (her ikisi de boşluk içeren satırlar dahil olmak üzere isteğe bağlı dosya adlarını işleyebilen):
Perl
perl -ne '`touch "$_"`' file
awk
awk '{printf "" > $0}' file
Linux ve benzeri sistemlerde, uzantıların çoğu dosya için isteğe bağlı olduğunu unutmayın. .txt
Metin dosyasına bir uzantı eklemek için hiçbir neden yoktur . Bunu yapmakta özgürsünüz ama hiç bir önemi yoktur. Yani, yine de uzantıyı istiyorsanız, aşağıdakilerden birini kullanın:
xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file
AWK, bu görev için de uygundur:
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
Başka bir yol tee
. Bir çizginin, filelist'te birden fazla dize içeriyorsa, bu yaklaşımın kopacağına dikkat edin.
testerdir:$ echo "" | tee $(cat filelist)
testerdir:$ ls
filelist george james john stewert
</dev/null tee $(cat filelist)
Borulardan kaçınmak istiyorsanız alternatif olarak da yapılabilir.
cp /dev/null
yaklaşım (Bunun gösterdiğim gibi, boşluk içeren dosya isimleriyle çalışıyor):
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
echo "" | tee file1 file2 file2
. Ancak dosya isimleri boşluk içeriyorsa kırılır.