Memindahkan file dengan find + xargs: target bukan direktori?

9

Ketika saya menjalankan perintah berikut:

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

Saya mendapatkan ratusan baris yang mengatakan:

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

Mengapa? Saya pikir xargs akan menjalankan:

mv /foo/barXX.csv some_dir

untuk setiap file yang findditemukan. Apa yang sedang terjadi? By the way, ini dengan zsh

Memperbarui:

Pembaruan1:

Saya mencoba:

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

tapi kemudian saya mendapat beberapa baris seperti:

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

meskipun saya pikir perintah ini memindahkan file saya dengan benar.

Pembaruan2:

Saya sepertinya tidak membutuhkan -topsi saat menggunakan mvsendiri. Sebagai contoh

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

bekerja dengan baik. Mengapa saya perlu -tsaat menggunakan xargs?

Amelio Vazquez-Reina
sumber

Jawaban:

14

Dengan asumsi Anda memiliki GNU ( find, xargs, & mv), mengubah perintah Anda untuk ini:

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

kutipan dari mvhalaman manual

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

Di atas xargs ...akan membangun perintah sehingga panggilan untuk pindah akan seperti ini:

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

Tidak perlu xargs

Anda dapat melewati pendekatan ini dengan hanya findmelakukan semua pekerjaan itu sendiri:

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

Mengapa Anda membutuhkannya mv -t ...?

Ini ada hubungannya dengan cara xargsmembangun set file untuk diteruskan ke perintah yang akan dijalankan setiap kali, (yaitu mv ...).

Ketika Anda menjalankan mvsendiri perintah secara manual, Anda mengontrol berapa banyak nama file yang diteruskan ke sana sehingga Anda tidak perlu khawatir perlu -t my_dirkarena Anda selalu akan menempatkan direktori tujuan terakhir.

Referensi

slm
sumber
Terima kasih! Ini sangat membantu. Saya agak bingung (lihat Pembaruan saya)
Amelio Vazquez-Reina
1
Perintah yang dikonstruksikan adalah mv -t some_dir 1.csv 2.csv 3.csv ...argumen file yang terakhir. Itulah kesalahan dalam pertanyaan, untuk menggunakan {}Anda harus melewati -I {}untuk xargs.
frostschutz
Terima kasih. Itu menjelaskan semuanya. Bagaimana dengan pertanyaan kedua yang saya miliki di Pembaruan 2? Tahukah Anda mengapa saya tidak perlu -tdengan banyak file dan direktori dengan yang biasa mv?
Amelio Vazquez-Reina
1
@ user815423426 - Saya akan memperbaruinya nanti ketika saya mendapat kesempatan malam ini, saya tahu mengapa.
slm
@ user815423426 - Saya memperbarui pertanyaan, beri tahu saya apakah ini masuk akal mv -t.
slm
1

Anda juga dapat menggunakan perintah ls alih-alih mencari perintah:

ls /foot/bar/*.csv | xargs  mv -t some_dir
Luis Ángel Rodríguez
sumber