Dosyaları Linux'ta xargs ile nasıl taşıyabilirim?


24

Bunu deniyorum ve çalışmıyor:

ls file_* | xargs mv {} temp/

Herhangi bir fikir?


Çok dosyalı herkes bunun sürümünü taşır mı? ( xargs -n10örneğin)
Gert van den Berg

Yanıtlar:


31

OS X’te:

ls file_* | xargs -J {} mv {} temp/

Linux'ta:

ls file_* | xargs -i {} mv {} temp/

1
Linux'ta, en azından /sonunda isteğe bağlıdır. İsterseniz dahil edebilirsiniz, ancak gerekli değildir.
Scott

4
@ user1953864: -i(veya -J), yalnızca sonlarına taranmak yerine, gelen argümanlarla değiştirilecek bir belirteç belirtir. man xargs
Amadan

14
Sen belki söylemek gerekir -i{}boşluksuz. Ya da söyle -I {}.
Scott

1
"{}" Yerine "%" kullanmanın da işe yaradığını fark ettim -% ne anlama geliyor ve {} ne anlama geliyor? Örnek: ls dosyası_ * | Xargs -I% mv% temp /
dmonopoly

3
@dmonopoly: Hiçbir anlamı yok. Parametre ne olursa olsun, -iyerini alıyor. ls file_* | xargs -iFOO mv FOO temp/tam olarak aynı çalışır.
Amadan,

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findlskabuğunuzun izin verdiği program argümanlarının sayısından daha fazla dosya olabileceğinden daha iyidir .


2
Sorunun yalnızca file_*geçerli dizindeki dosyaları işlemeyi arzu ettiğini , buna karşın find(ek seçenek olmadan) geçerli dizinin altındaki tüm dizin ağacını arayacağını unutmayın.
Scott

1
Evet doğru. -maxdepth 0Bunu önlemek için ekleyin .

"daha iyi" özneldir. Daha güçlü, daha karmaşık ve daha yavaş; ve mvdosyaları birlikte mi yoksa tek tek mi işlemeniz umrunda olmamakla birlikte, diğer bazı kullanımlar olabilir.
Amadan

Düzenlendi (eklendi -maxdepth 0)

8

Mv'de -t "hedef dizin belirtin" i kullanın, dosyaları * hedef dizine / temp'a taşıyarak çalışmalıdır.

örn .: - #ls -l dosyası * | xargs mv -t / temp


4

@ User1953864 tarafından önerildiği gibi: { -i, -J}, gelen argümanlarla değiştirilecek bir belirteç belirtin.

Örneğin ls:

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

Daha sonra tüm java dosyalarını someDirectory klasörüne taşımak xargsaşağıdaki gibi olacaktır:

Linux'ta

ls *.java | xargs -i mv {} someDirectory/

MacOS'ta

ls *.java | xargs -J mv {} someDirectory

0

Başka bir çözüm olabilir:

 for f in file_* ; do
   mv $f temp/$f
 done

Dezavantajı, mvher dosya için yeni bir işlem gerektirmesidir.

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.