Dengan GNU mv :
find path_A -name '*AAA*' -exec mv -t path_B {} +
Itu akan menggunakan -exec
opsi find yang menggantikan {}
dengan setiap hasil find secara bergantian dan menjalankan perintah yang Anda berikan. Sebagaimana dijelaskan dalam man find
:
-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of `;' is encountered.
Dalam hal ini, kami menggunakan +
versi -exec
sehingga kami menjalankan sesedikit mv
mungkin operasi:
-exec command {} +
This variant of the -exec action runs the specified command on
the selected files, but the command line is built by appending
each selected file name at the end; the total number of invoca‐
tions of the command will be much less than the number of
matched files. The command line is built in much the same way
that xargs builds its command lines. Only one instance of `{}'
is allowed within the command. The command is executed in the
starting directory.
+
yang menghantam pekerjaan, Anda dapat membaca kutipan saya di atas atauman find
sebagai gantinya-exec mv {} path_b +
dan gagal dengan kesalahan izin. TBH, saya masih tidak mengerti mengapa, tetapi-exec mv -t path_b {} +
berhasil!-exec ... {} +
,{}
harus menjadi hal terakhir sebelum+
. Ini sebabnya dia menggunakanmv -t destdir {} +
dan tidakmv {} destdir +
. Satu dingin digunakan-exec mv {} destdir ';'
sebagai gantinya, tetapi itu akan dieksekusimv
sekali untuk setiap file.Anda dapat melakukan sesuatu seperti di bawah ini juga.
Dimana,
-0
Jika ada spasi atau karakter kosong (termasuk baris baru) banyak perintah tidak akan berfungsi. Opsi ini menangani nama file dengan ruang kosong.-I
Ganti kemunculan pengganti-str dalam argumen-awal dengan nama yang dibaca dari input standar. Juga, blanko tanda kutip tidak menghentikan item input; sebaliknya pemisah adalah karakter baris baru.Pengujian
Saya membuat dua direktori sebagai
sourcedir
dandestdir
. Sekarang, saya membuat banyak file di dalamnyasourcedir
sebagaifile1.bak
,file2.bak
danfile3 with spaces.bak
Sekarang, saya menjalankan perintah sebagai,
Sekarang, di dalam
destdir
, ketika saya melakukannyals
, saya bisa melihat bahwa file telah pindah darisourcedir
kedestdir
.Referensi
http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/
sumber
Untuk kepentingan pengguna OS X menemukan pertanyaan ini, sintaks di OS X sedikit berbeda. Anggap Anda tidak ingin mencari secara rekursif di subdirektori dari
path_A
:Jika Anda ingin mencari semua file secara rekursif di
path_A
:sumber
find
saya gunakan. Poin bagus:-maxdepth
(terutama jika path_B adalah subdirektori - hindarimv
mencoba memindahkan file yang sudah ada!) Dan menggunakan \; (jadi {} tidak harus menjadi parameter terakhir danmv
sintaks normal dapat digunakan)Ini
-exec
adalah cara terbaik untuk melakukan ini. Jika, karena alasan apa pun, ini bukan opsi, Anda juga dapat membaca hasilnya dalam satu lingkaran:Itu cara yang aman, dapat menangani nama file yang berisi spasi, baris baru atau karakter aneh lainnya. Cara yang lebih sederhana, tetapi yang gagal kecuali nama file Anda hanya terdiri dari karakter alfanumerik sederhana , adalah
Tapi gunakan loop sementara.
sumber
your file names consist only of simple alphanumeric characters
, misalnya jika mencapaiARG_MAX
Hanya menggunakan fitur POSIX dari
find
(dan juga darimv
):Bacaan lebih lanjut:
sumber
Cara lain
sumber