Bagaimana saya bisa memindahkan file dengan xarg di Linux?

24

Saya mencoba ini dan tidak berfungsi:

ls file_* | xargs mv {} temp/

Ada ide?

Peter Mortensen
sumber
Adakah yang memiliki versi multi-file move ini? ( xargs -n10misalnya)
Gert van den Berg

Jawaban:

31

Di OS X:

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

Di Linux:

ls file_* | xargs -i {} mv {} temp/
Amadan
sumber
1
Di Linux, setidaknya, /pada akhirnya adalah opsional. Anda dapat memasukkannya jika Anda mau, tetapi itu tidak perlu.
Scott
4
@ user1953864: -i(atau -J) tentukan token yang akan diganti dengan argumen yang masuk, alih-alih hanya ditempel di bagian akhir. man xargs
Amadan
14
Anda mungkin perlu mengatakan -i{}, tanpa spasi. Atau katakan -I {}.
Scott
1
Saya perhatikan bahwa menggunakan "%" sebagai pengganti "{}" juga berfungsi - apa arti% dan apa {} artinya? Contoh: ls file_ * | xargs -I% mv% temp /
dmonopoly
3
@monopoli: Mereka tidak berarti apa - apa. Apa pun parameternya -i, ia akan diganti. ls file_* | xargs -iFOO mv FOO temp/bekerja persis sama.
Amadan
8

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

findlebih baik daripada di lsmana mungkin ada lebih banyak file daripada jumlah argumen program yang diizinkan oleh shell Anda.

David-SkyMesh
sumber
2
Perhatikan bahwa pertanyaan menyarankan keinginan untuk hanya memproses file_*file dalam direktori saat ini, sementara find(tanpa opsi tambahan) akan mencari seluruh pohon direktori di bawah direktori saat ini.
Scott
1
Ya benar. Tambahkan -maxdepth 0untuk mencegah ini.
"lebih baik" adalah subyektif. Lebih kuat, lebih kompleks, dan lebih lambat; dan sementara mvtidak peduli jika Anda memproses file bersama atau secara individual, beberapa kegunaan lain mungkin.
Amadan
Diedit (ditambahkan -maxdepth 0)
8

Gunakan -t "tentukan target directoty" di mv, ini seharusnya berfungsi memindahkan file * ke direktori tujuan / temp

mis: - #ls -l file * | xargs mv -t / temp

Ratheesh
sumber
4

Seperti yang disarankan oleh @ user1953864: { -i, -J} tentukan token yang akan diganti dengan argumen yang masuk.

Sebagai contoh ls:

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

Kemudian untuk memindahkan semua file java ke folder someDirectory dengan xargsakan sebagai berikut:

Di Linux

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

Di MacOS

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

Solusi lain mungkin:

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

Kerugiannya adalah melakukan mvproses baru untuk setiap file.

Basile Starynkevitch
sumber