วิธีการเปลี่ยนชื่อไฟล์ในขณะที่คัดลอก?


12

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

cp จาก:

/backup/path/data/Erp.2014.02.16_16.57.03-2b0fd460_1426b77b1ee_-7b8e.etf

ถึง:

/home/user/data/Erp.2014.02.16_16.57.03.etf

แต่ละไฟล์จะเริ่มต้นด้วย "Erp" ตามด้วยสตริงการประทับวันที่ตามเวลาด้วยสตริงแบบสุ่มและจากนั้นส่วนขยาย ".etf" ฉันต้องการเก็บองค์ประกอบของชื่อทั้งหมดรวมถึงการประทับวันที่ ฉันแค่ต้องการลบสตริงแบบสุ่ม

สตริงสุ่มช่วยให้การสำรองข้อมูลหลายไฟล์เดียวกัน อย่างไรก็ตามในกรณีนี้ฉันเพิ่งรัน fdupes และไม่มีการซ้ำซ้อน ดังนั้นฉันสามารถกู้คืนไฟล์ทั้งหมดโดยลบสตริงแบบสุ่ม

ฉันกำลังมองหาคำสั่ง bash หนึ่งบรรทัดเพื่อทำ

หากไม่ได้ผลฉันสามารถทำได้สองขั้นตอนขึ้นไป ปกติฉันจะใช้ KRename แต่ในกรณีนี้ฉันต้องทุบตี (ฉันทำงานจากระยะไกล)

คำตอบ:


7

paxสามารถทำได้ทั้งหมดในครั้งเดียว คุณสามารถทำได้:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' Erp*etf /home/user/data

paxสงวนเวลาโดยค่าเริ่มต้น แต่สามารถเพิ่ม-peเพื่อรักษาทุกอย่าง (ทำได้ดีที่สุดในฐานะรูท) หรือ-ppเพื่อสงวนสิทธิ์เช่น:

cd /backup/path/data && pax -wrs'/-.*$/.etf/' -pe Erp*etf /home/user/data

มิฉะนั้น ( paxโดยปกติจะไม่สามารถใช้งานได้ตามปกติ) แน่นอนว่าจะเป็นการดีกว่าถ้าทำสำเนาแล้วrename:

cp -a /backup/path/data/Erp*.etf /home/user/data
rename 's/-.*$/.etf/' /home/user/data/Erp*.etf

วิธีนี้ไม่มีกระบวนการที่แตกต่างกันเริ่มต้นสำหรับแต่ละไฟล์


1
paxฉันจะเห็นว่าฉันจะต้องทำความคุ้นเคยกับ ดูเหมือนว่าเป็นเครื่องมือที่มีประโยชน์มาก ทำให้ผมสงสัยว่าทำไมมันไม่ได้เป็นมาตรฐานในการ distros เพิ่มเติม ...
MountainX

@ MountainX, คำถามที่ดีตาม Wikipedia, paxได้อยู่ใน Linux Standard Base ตั้งแต่ปี 2005 นอกจากนี้ GNU cpioอาจเป็นเครื่องมือทางเลือกที่มีคุณสมบัติน้อยที่สุดในการดำรงอยู่
แกรม

1
+1 สำหรับโซลูชันล่าสุดของคุณและวิธีนี้ไม่มีกระบวนการที่แตกต่างกันเริ่มต้นสำหรับแต่ละไฟล์ แต่ renameแตกต่างกับ Fedora / Red Hat: ฉันไม่รู้ว่าจะใช้ยังไงในกรณีนี้
erik

15

คุณสามารถใช้cpคำสั่งพร้อม-aตัวเลือก

-a, --archive
       same as -dR --preserve=all

จากนั้นใช้ a สำหรับลูปเพื่อเปลี่ยนชื่อไฟล์ทั้งหมดในขณะที่คัดลอก:

for file in Erp*etf; do
  cp -a $file destinationDirectory/${file%%-*}.etf
done

พร้อมแล้ว เริ่มคำสั่งนี้ในไดเรกทอรีต้นทาง

คำอธิบาย:การ%%-*จะตัดอักขระทั้งหมดหลังจากการปรากฏขึ้นครั้งแรกของเครื่องหมายขีดคั่น / ลบ-และ.etfเมื่อสิ้นสุดอีกครั้งจะเพิ่มนามสกุลไฟล์

เอาล่ะมาเป็นหนึ่งซับเลยค่ะ :-) แบบนี้

for file in Erp*etf; do cp -a $file destinationDirectory/${file%%-*}.etf; done

1
ขอบคุณคุณช่วยอ้างเอกสารสำหรับ%%-*เคล็ดลับได้ไหม ฉันอยากรู้.
Soyuka

3

ใน zsh zmvใช้ ใส่สิ่งนี้ใน.zshrc:

autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'

จากนั้นใช้

zcp '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

ในทุบตี:

zsh -c 'autoload zmv; zmv -C $0 $1' '/backup/path/data/(*)-[0-9A-Fa-f_]#.(*)' '/home/user/data/$1$2'

หากคุณไม่มี zsh วิธี POSIX จะใช้ pax (ซึ่งจะเป็นการคัดลอกไดเรกทอรีซ้ำ)

หากคุณอยู่ในระบบที่ถูก จำกัด โดยไม่มี zsh และไม่มี pax คุณสามารถใช้การวนซ้ำได้:

for source in /backup/path/data/*-*.etf; do
  basename=${source##*/}
  cp "$source" "/home/user/data/${basename%-*}.${basename##*.}"
done

1

cpไม่มีความสามารถนั้น ฉันจำได้cpioว่าสามารถทำเช่นนั้นได้ แต่ manpage ปัจจุบันพูดเป็นอย่างอื่น อย่างไรก็ตาม (gnu) tarมี--transformตัวเลือก:

 --transform, --xform EXPRESSION
       use sed replace EXPRESSION to transform file names

ดังนั้นคุณจะมี cmdline เช่น:

(cd /backup/path/data; tar --create --transform 's/-.*-....//' .) | (cd /home/user/data; tar --extract)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.