Bagaimana cara menguji file mana yang akan disalin dengan perintah cp?


11

Saya membuat skrip sederhana yang menyalin semua file dari DIRECTORYA yang tidak ada di DIRECTORYB. Saya melakukan ini melalui penggunaan perintah cp:

cp -u DIRECTORYA/* DIRECTORYB

Yang ingin saya lakukan adalah mengirim email ke administrator yang akan membuat daftar file yang telah disalin.

Jadi idealnya, sebelum saya menjalankan perintah di atas, saya ingin mendapatkan file yang akan disalin dan menyimpannya dalam variabel untuk digunakan nanti ketika membangun pesan email saya.

Dapatkah seseorang menunjukkan saya arah yang benar? Saya telah melihat ke dalam menggunakan grep tetapi saya tidak berpikir ini bisa dilakukan dengan perintah cp?


1
Mungkin saya salah memahami pertanyaan Anda, tetapi tidak bisakah Anda menggunakan -vbendera, untuk mencetak nama file saat disalin? Arahkan itu ke file atau langsung dalam variabel dan gunakan itu untuk membangun pesan Anda.
ThibautRenaux

Selain itu cpperintah memiliki opsi --attributes-onlyyang memungkinkan untuk tidak menyalin file data, tetapi hanya direktori dan struktur file.
Costas

Maaf saya cukup baru dalam scripting. Jika saya menggunakan flag -v, bagaimana saya bisa output ke variabel, bukan file?
James

1
Dengan asumsi Anda menggunakan bash, variable=$(cp -v ...)tangkap stdout cp. Lihat gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Jawaban:


4

Saya tidak berpikir GNU cpmemiliki sesuatu untuk membantu Anda jika Anda ingin melihat apa yang akan dilakukannya tanpa bertindak. Jika Anda ingin mencatat file yang dimodifikasi, Anda dapat menggunakan -vopsi:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Alih-alih cp, Anda dapat menggunakan rsync , yang jauh lebih kuat dan diinstal hampir di mana-mana kecuali untuk sistem embedded low-end (dan mudah dipasang di tempat yang tidak ada secara default).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

atau

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

2

Jika Anda ingin menjalankan cp foo*bar whatever, maka jalankan echo foo*bar whateversaja.


Tapi OP ingin menjalankan cp -udan dia mencari opsi kering seperti run untuk cp.
Arkadiusz Drabczyk

2

Menurut halaman manual ,

-u, salin hanya ketika file SOURCE lebih baru dari file tujuan atau ketika file tujuan hilang--update

ini adalah fitur yang menggabungkan dua tes, satu sepele untuk diimplementasikan dalam skrip ( hilang ) dan satu membutuhkan beberapa pekerjaan ( baru ). Anda dapat membuat skrip yang melaporkan apa yang perlu digunakan comm, diffdan test.

Tidak ada cputilitas standar yang menyediakan kemampuan untuk mengeringkan operasi penyalinan. Seperti yang disarankan, rsyncadalah cara untuk melakukan ini dengan utilitas yang tersedia secara umum. Tentu saja, rsyncbiasanya digunakan untuk menyalin berdasarkan kriteria lebih dari sekadar yang baru atau tidak ada (ukuran file dan stempel waktu juga digunakan). Tapi itu bisa direduksi menjadi adil cp -u.

Untuk utilitas non-standar, ada copyutilitas yang saya tulis (dan tentu saja masih digunakan) pada akhir 1980-an. Itu mungkin terinspirasi oleh makeutilitas, karena opsi pertama yang saya tambahkan adalah -n.

Untuk contoh yang diberikan, ini akan digunakan seperti ini:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Bacaan lebih lanjut:

  • salin - salin / direktori salin utilitas

    -n menonaktifkan pembuatan atau modifikasi file yang sebenarnya, dan (tergantung pada tingkat verboseness) menunjukkan efek yang copy akan dimiliki perintah.
    -u menyalin file hanya jika ukuran atau tanggal modifikasi berbeda, dan tautan hanya jika teks tautan berbeda.
    -U hanya menyalin file yang lebih baru dari tujuan, atau yang tidak ada di tujuan.

  • entri changelog dari Agustus 1988 :

    1988-08-16    
            * src / copy / src / copy.c: menambahkan opsi "-d" dan "-n".
    

0

Anda dapat menggunakan perintah diff. Saya memiliki pekerjaan yang menyalin beberapa file cadangan setiap hari. beberapa waktu saya perlu memeriksa apakah semua file disalin, di sini adalah sintaks:

diff /file1/ /file2/

dan tentu saja jika Anda ingin menyalinnya gunakan:

cp -u /file1/* /file2

0

Pertimbangkan menggunakan rsync sebagai gantinya. Rsync bekerja dengan sangat baik pada salinan lokal dan tentu saja dapat melakukan apa yang Anda inginkan, setelah Anda menjelajahi lima belas trilyun opsi yang dimilikinya.

rsync -avun DIRECTORYA/ DIRECTORYB

akan menunjukkan semua yang akan dilakukan, dan

rsync -avu DIRECTORYA/ DIRECTORYB

akan melakukannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.