Temukan dan salin file

128

Mengapa yang berikut tidak menyalin file ke folder tujuan?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
shantanuo
sumber

Jawaban:

273

Jika maksud Anda adalah menyalin file yang ditemukan ke / home / shantanu / tosend Anda memiliki urutan argumen untuk cp dibalik:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Catatan: temukan perintah gunakan {} sebagai placeholder untuk file yang cocok

malcolmpdx
sumber
14
Apa tujuannya \;?
Astrid
5
@Astrid periksa ini
shellbye
find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;Adakah yang salah dengan perintah ini? itu tidak berfungsi
mrid
2
Tidak berfungsi jika hasilnya memiliki ruang di jalur. Ada saran untuk ini?
TheJeff
1
Di Ubuntu 18 kurung kurawal juga harus dimasukkan ke dalam tanda kutip tunggal: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo
32

saya menghadapi masalah seperti ini ...

Sebenarnya, dalam dua cara Anda dapat memproses findoutput copyperintah dalam perintah

  1. Jika findoutput perintah tidak mengandung spasi apa pun yaitu jika nama file tidak mengandung spasi di dalamnya maka Anda dapat menggunakan perintah yang disebutkan di bawah ini:

    Sintaksis: find <Path> <Conditions> | xargs cp -t <copy file path>

    Contoh: find -mtime -1 -type f | xargs cp -t inner/

  2. Tetapi sebagian besar waktu file data produksi kami mungkin mengandung ruang di dalamnya. Jadi sebagian besar waktu di bawah perintah yang disebutkan lebih aman:

    Sintaksis: find <path> <condition> -exec cp '{}' <copy path> \;

    Contoh find -mtime -1 -type f -exec cp '{}' inner/ \;

Pada contoh kedua, bagian terakhir yaitu semi-colon juga dianggap sebagai bagian dari findperintah, yang harus diloloskan sebelum menekan tombol enter. Kalau tidak, Anda akan mendapatkan kesalahan seperti ini

find: missing argument to `-exec'

Dalam kasus Anda, sintaks perintah salin salah untuk menyalin file find /home/shantanu/tosend. Perintah berikut akan berfungsi:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Thiyagu ATR
sumber
3. Jika Anda memiliki GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Contoh:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight
7

Anda perlu menggunakan cp -t /home/shantanu/tosenduntuk mengatakan bahwa argumennya adalah direktori target dan bukan sumber. Anda kemudian dapat mengubahnya -exec ... +agar cpdapat menyalin file sebanyak mungkin sekaligus.

Ignacio Vazquez-Abrams
sumber
2
Di linux harus menentukan direktori target seperti: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM
3
Jawaban ini dapat ditingkatkan dan dipersingkat jika perintah lengkap diberikan seperti pada jawaban teratas.
Brian
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A
sumber
-2

Alasan untuk kesalahan itu adalah bahwa Anda mencoba untuk menyalin folder yang memerlukan opsi -r juga untuk cp Terima kasih

Sebin John
sumber
3
Hai, karena pertanyaan sudah dijawab (sejak beberapa waktu lalu) ini sebenarnya bukan jawaban yang relevan, itu juga harus menjadi komentar (ketika Anda memiliki beberapa perwakilan lagi), kecuali jika Anda ingin memperluas dan menjelaskannya. Hanya kepala saja :).
W1ll1amvl