Find + xargs: target ile dosyaları taşımak bir dizin değil mi?


9

Aşağıdaki komutu çalıştırdığımda:

> mkdir some_dir
> find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} some_dir

Yüzlerce satır alıyorum:

mv: target `/foo/bar/XX.csv` is not a directory

Neden? Ben xargs yürütmek düşündüm:

mv /foo/barXX.csv some_dir

findbulduğu her dosya için . Neler oluyor? Bu arada, bu zsh ile

Güncelleme:

Update1:

Denedim:

find /foo/bar/ -name '*.csv' -print0 | xargs -0 mv {} -t some_dir

ama sonra birkaç satır var:

mv: cannot stat `{}': No such file or directory

komutun dosyalarımı doğru şekilde taşıdığını düşünüyorum.

Update2:

Yalnız -tkullanırken seçeneğe ihtiyacım yok gibi görünüyor mv. Örneğin

> touch file1.txt
> touch file2.txt
> mkdir my_dir
> mv  file1.txt  file2.txt  my_dir

iyi çalışıyor. -tKullanırken neden ihtiyacım var xargs?

Yanıtlar:


14

GNU'nuz varsayalım ( find,, xargs& mv), komutunuzu şu şekilde değiştirin:

$ find /foot/bar/ -name '*.csv' -print0 | xargs -0 mv -t some_dir

man sayfasından alıntımv

   -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY

Yukarıdaki xargs ...komut, hareket çağrılarının şu şekilde olması için komutu oluşturacaktır:

 $ mv 1.csv 2.csv 3.csv ... -t some_dir

Xargs'a gerek yok

findTüm işi kendisinin yapmasıyla bu yaklaşımı atlayabilirsiniz :

$ find /foot/bar/ -name '*.csv' -exec mv -t some_dir {} +

Neden ihtiyacın var mv -t ...?

Bu, xargsher seferinde çalışacağı komuta geçmek için dosya kümesini inşa etme yöntemiyle ilgilidir (yani mv ...).

mvKomutu manuel olarak kendiniz çalıştırdığınızda, ona kaç dosya adı aktarıldığını kontrol edersiniz ve bu nedenle -t my_dirher zaman hedef dizini en sonda tutacağınız için, endişelenmenize gerek yoktur .

Referanslar


Teşekkürler! Bu çok yardımcı. Yine de biraz kafam karıştı (Güncellemelerime bakın)
Amelio Vazquez-Reina

1
Yapılmış komut mv -t some_dir 1.csv 2.csv 3.csv ...böylece dosya argümanlarının son halini alır. Bu sorudaki hata, kullanmak {}için geçmek -I {}zorunda xargs.
frostschutz

Teşekkürler. Bu her şeyi açıklıyor. Güncelleme 2'de sorduğum ikinci soru ne olacak? Neden -tbirden fazla dosyaya ve düzenli bir dizine ihtiyacım olmadığını biliyor musunuz mv?
Amelio Vazquez-Reina

1
@ user815423426 - Bu gece bir şansım olduğunda daha sonra güncelleyeceğim, nedenini biliyorum.
slm

@ user815423426 - Soruyu güncelledim, wrt mantıklı olup olmadığını bana bildirin mv -t.
slm

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.