วิธีทดสอบว่าจะคัดลอกไฟล์ใดด้วยคำสั่ง cp


11

ฉันกำลังสร้างสคริปต์ง่าย ๆ ที่คัดลอกไฟล์ทั้งหมดจาก DIRECTORYA ที่ไม่มีอยู่ใน DIRECTORYB ฉันทำสิ่งนี้ผ่านการใช้คำสั่ง cp:

cp -u DIRECTORYA/* DIRECTORYB

สิ่งที่ฉันต้องการทำคือการส่งอีเมลไปยังผู้ดูแลระบบที่จะแสดงรายการไฟล์ที่ถูกคัดลอก

ดังนั้นก่อนที่ฉันจะเรียกใช้คำสั่งด้านบนฉันต้องการรับไฟล์ที่จะคัดลอกและเก็บไว้ในตัวแปรเพื่อใช้ในภายหลังเมื่อสร้างข้อความอีเมลของฉัน

ใครช่วยชี้ฉันในทิศทางที่ถูกต้องได้ไหม ฉันเคยใช้ grep มาก่อน แต่ฉันไม่คิดว่ามันจะใช้คำสั่ง cp ได้หรือไม่


1
บางทีฉันอาจเข้าใจผิดคำถามของคุณ แต่คุณไม่สามารถใช้การ-vตั้งค่าสถานะเพื่อพิมพ์ชื่อไฟล์ที่พวกเขาคัดลอก? เปลี่ยนเส้นทางไปยังไฟล์หรือโดยตรงในตัวแปรและใช้เพื่อสร้างข้อความของคุณ
ThibautRenaux

นอกจากนี้cpคำสั่งมีตัวเลือกที่--attributes-onlyอนุญาตให้ไม่คัดลอกข้อมูลไฟล์ แต่เพียงไดเรกทอรีและโครงสร้างไฟล์
Costas

ขออภัยฉันค่อนข้างใหม่ในการเขียนสคริปต์ หากฉันใช้แฟล็ก -v ฉันจะส่งออกไปยังตัวแปรแทนไฟล์ได้อย่างไร
James

1
สมมติว่าคุณกำลังใช้ bash ให้variable=$(cp -v ...)จับ stdout ของ cp ดูgnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

คำตอบ:


4

ฉันไม่คิดว่า GNU cpจะมีอะไรช่วยคุณถ้าคุณต้องการดูว่ามันจะทำอะไรถ้าไม่ทำ หากคุณต้องการบันทึกไฟล์ที่ถูกดัดแปลงคุณสามารถใช้-vตัวเลือก:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

แทนที่จะcpใช้คุณสามารถใช้rsyncซึ่งมีประสิทธิภาพมากกว่าและติดตั้งได้เกือบทุกที่ยกเว้นระบบฝังตัวระดับล่าง (และติดตั้งง่ายซึ่งไม่ได้มีอยู่ในค่าเริ่มต้น)

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

หรือ

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

3

ตามที่หน้าคู่มือ ,

-uให้ คัดลอกเฉพาะเมื่อไฟล์SOURCE ใหม่กว่าไฟล์ปลายทางหรือเมื่อไฟล์ปลายทางหายไป--update

นี่เป็นคุณลักษณะที่รวมการทดสอบสองรายการหนึ่งเรื่องเล็กน้อยที่จะนำไปใช้ในสคริปต์ ( ขาดหายไป ) และอีกอันหนึ่งต้องการงานบางอย่าง ( ใหม่กว่า ) คุณสามารถทำให้สคริปต์ซึ่งรายงานสิ่งที่จำเป็นในการใช้comm, และdifftest

ไม่มีcpโปรแกรมอรรถประโยชน์มาตรฐานใด ๆให้ความสามารถในการดำเนินการคัดลอกแบบแห้ง ตามที่แนะนำrsyncคือวิธีการทำสิ่งนี้กับยูทิลิตีที่มีอยู่ทั่วไป แน่นอนว่าrsyncโดยปกติจะใช้ในการคัดลอกตามเกณฑ์มากกว่าที่ใหม่กว่าหรือหายไป (ใช้ขนาดไฟล์และการประทับเวลาด้วย) cp -uแต่ก็สามารถลดลงไปทำเพียงแค่

สำหรับcopyยูทิลิตี้ที่ไม่ได้มาตรฐานมียูทิลิตี้ที่ฉันเขียน (และยังคงใช้อยู่) ในช่วงปลายทศวรรษ 1980 มันอาจจะเป็นแรงบันดาลใจจากยูทิลิตี้ตั้งแต่ตัวเลือกแรกที่ฉันจะเพิ่มเป็นmake-n

สำหรับตัวอย่างที่กำหนดมันจะถูกใช้เช่นนี้:

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

อ่านเพิ่มเติม:

  • ยูทิลิตี้การคัดลอก - ไฟล์ / ไดเรกทอรี

    -n ปิดใช้งานการสร้างหรือแก้ไขไฟล์จริงและ (ขึ้นอยู่กับระดับของการฟุ่มเฟื่อย) แสดงผลที่ copy คำสั่งจะมี
    -u คัดลอกไฟล์เฉพาะในกรณีที่ขนาดหรือวันที่แก้ไขแตกต่างกันและลิงก์เฉพาะเมื่อข้อความลิงค์แตกต่างกัน
    -U คัดลอกเฉพาะไฟล์ที่ใหม่กว่าปลายทางหรือไม่มีในปลายทาง

  • รายการการเปลี่ยนแปลงจากสิงหาคม 2531 :

    1988/08/16    
            * src / copy / src / copy.c: เพิ่มตัวเลือก "-d" และ "-n"
    

2

หากคุณต้องการเรียกใช้cp foo*bar whateverให้เรียกใช้echo foo*bar whateverแทน


1
แต่ OP ต้องการเรียกใช้cp -uและเขากำลังมองหาตัวเลือก cp
Arkadiusz Drabczyk

0

คุณสามารถใช้คำสั่ง diff ฉันมีงานที่คัดลอกไฟล์สำรองทุกวัน บางครั้งฉันต้องตรวจสอบว่าไฟล์ทั้งหมดถูกคัดลอกนี่คือไวยากรณ์:

diff /file1/ /file2/

และแน่นอนถ้าคุณต้องการคัดลอกใช้:

cp -u /file1/* /file2

0

พิจารณาใช้ rsync แทน Rsync ทำงานได้ดีบนสำเนาในเครื่องและสามารถทำสิ่งที่คุณต้องการได้อย่างแน่นอนเมื่อคุณลุยกับตัวเลือกทั้งหมดสิบห้าล้านล้าน

rsync -avun DIRECTORYA/ DIRECTORYB

จะแสดงให้คุณเห็นทุกสิ่งที่จะทำและ

rsync -avu DIRECTORYA/ DIRECTORYB

จะทำมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.