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.txtvb
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.txtvb
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 readkadar çalışır ; girişi , yönlendirme nedeniyle terminalden ziyade geçerli çalışma dizininde adı verilen bir dosyadan okunur ;read1readin<intouch "$line.txt": Bu, touchdeğeri izleyen ve $line.txtbunun 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.txttouchxargs+ kullanarak touch:xargs -a in -I name touch name.txt
-a in: mevcut çalışma dizinindeki xargsbir dosyadan girişini okur in;-I name: Aşağıdaki komutta, mevcut giriş satırının xargsher oluşumunu değiştirir name;touch name: touchDeğ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 linesatırı nasıl okuyacak? @kos
<insonra doneyapar readiçinde whiledöngü durumu okumak ve depolamasına bir satır iniçinde lineher tekrarda; Bu şekilde, touch "$line.txt"ilmek iç .txtkısmı sonda ile okuma çizgisine genişletilecektir .
while read line; do touch "$line.txt"; done <inyalnı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 "$_"`' fileawk
awk '{printf "" > $0}' file Linux ve benzeri sistemlerde, uzantıların çoğu dosya için isteğe bağlı olduğunu unutmayın. .txtMetin 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.