Komut kabuğunda x kez yinelenen dosya


22

Bir formasını kullanarak bir video dosyasını komut satırından x kez kopyalamaya çalışıyorum, bu şekilde denedim, ancak çalışmıyor:

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done

5
Senin sadece hata değil mi echoolmamalıdır hangi ve $1hangi olmalıdır $i?
Julie Pelletier,

yankıyı kaldırırsam ve yalnızca kullanırsam test$1.oggşunu söyler: test.ogg ve test.ogg aynı dosyalardır , bu yüzden $ 1 tanınmadı gibi görünüyor?
Kara

@EdwardBlack: Gereksinimlerinizi yanlış anladığım gibi ses çıkarıyor. Bu çözüm uygun değil.
cuonglm

@JuliePelletier, kahretsin, bazen bana yanlışlıkla yazmak $1yerine $iyazarım, sabahları earlie, üzgünüm ... teşekkür ederim. Bunun $xyerine gelecekte kullanacağım$i
Black

Yanıtlar:


25

Shell kodunuzun iki sorunu var:

  1. echoOlmamalı.
  2. Değişken $i, $1hedef dosya adındaki gibi yanlış yazılmış .

Bir dosyanın kopyasını, dosyayla aynı dizinde yapmak için

cp thefile thecopy

Oraya başka bir şey eklerseniz, örneğin

cp thefile theotherthing thecopy

o zaman kopyalamak istediğiniz varsayılır thefileve theotherthingiçine dizinde denilen thecopy.

Senin durumunda, özel olarak adlandırılmış test.oggve echodizine kopyalamak için adlandırılmış bir dosyayı arar test$1.ogg.

Büyük $1olasılıkla boş bir dizeye genişleyecektir. Bu nedenle, echokomuttan sildiğinizde "test.ogg ve test.ogg aynı dosyalardır"; yürütülmekte olan komut esasen

cp test.ogg test.ogg

Bu muhtemelen bir yanlış yazımdır.

Sonunda, böyle bir şey istersiniz:

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

Veya alternatif olarak

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

Veya, kullanarak tee:

tee test{1..100}.ogg <test.ogg >/dev/null

Not: Bu büyük olasılıkla 100 kopya için işe yarar, ancak binlerce kopya için "çok uzun bir tartışma listesi" hatası oluşturabilir. Bu durumda, bir döngü kullanmaya geri dönün.


12

Kısa ve hassas

< test.ogg tee test{1..100}.ogg

hatta daha iyisi

tee test{1..100}.ogg < test.ogg >/dev/null

Daha fazla yardım için tee komutu kullanımına bakınız .

Güncelleştirme

@Gilles tarafından önerildiği üzere, teeherhangi bir dosya meta verisinin korunmamasını sağlama hatası vardır. Bu sorunun üstesinden gelmek için, bundan sonra aşağıdaki komutu çalıştırmanız gerekebilir:

cp --attributes-only --preserve Source Target

3
Bu, birden fazla çağrıdan potansiyel olarak daha hızlıdır cp(mevcut belleğe göre dosya boyutuna bağlıdır), ancak herhangi bir dosya meta verisini korumamama kusuruna sahiptir.
Gilles 'SO- kötülük yapmayı bırak'

@Gilles ohh, bunun üstesinden gelebilir miyiz?
Rahul

3
Sonra koşabilirsin cp --attributes-only.
Gilles 'SO- kötülük yapmayı bırak'

@Gilles teşekkürler, yardımınıza göre cevabımı güncelledi.
Rahul

FWIW cp -pMeta verileri korumak için kullanılan diğer yanıtların hiçbiri .
roaima

11
for i in {1..100}; do cp test.ogg "test_$i.ogg" ; done

1
Değişken açılımlar alıntılanmalıdır.
kedi

1

Folowing komutu file.a dosyasını 5 kere kopyalayacaktır :

$ seq 5 | xargs -I AA cp file.a fileAA.a

Gg'yi tercih ederseniz (cp ile aynı değil):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a

0

Değişken i kopyalamamışsınız.

aşağıdaki betiği kullanın. Test edildiği gibi iyi çalıştı

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done

3
Bu, önceki iki cevapla aynıdır ve (1) soru 100 hakkında soru sormak dışında bir yorumdur ve cevabınız 10, (2) -rvfseçenekleri gereksiz yere eklediniz cpve (3) değişken genişlemenizi alıntılamada başarısız oldunuz. . (Ayrıca, noktalama işaretleri ;ve aşağıdaki sözcükler arasında boşluk bırakmanın geleneksel olduğuna da dikkat edin .) -pSeçeneğin eklenmesi değerlidir, ancak (4a) zaten yanıtlanmıştır (yorumlarda) ve (4b) cevabınız Ne yaptığınızı açıklamıyorsanız yararlı olur.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.