ฉันจะใช้ '{}' เพื่อเปลี่ยนทิศทางเอาต์พุตของคำสั่งที่รันผ่านตัวเลือก -exec ของ find ได้อย่างไร


26

ฉันกำลังพยายามทำให้svnadmin dumpคำสั่งสำหรับสคริปต์สำรองโดยอัตโนมัติและฉันต้องการทำสิ่งนี้:

find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;

นี้ดูเหมือนว่าจะทำงานในการที่จะดูผ่านแต่ละพื้นที่เก็บข้อมูล SVN ใน/var/svnและวิ่งsvnadmin dumpกับมัน

อย่างไรก็ตามที่สอง{}ในคำสั่ง exec ไม่ได้รับการแทนที่สำหรับชื่อของไดเรกทอรีที่กำลังประมวลผล {}.svnมันเป็นพื้นผลเพียงแค่ไฟล์เดียวชื่อ

ฉันสงสัยว่านี้เป็นเพราะเปลือกตีความ>เพื่อยุติคำสั่งและจะพยายามเปลี่ยนทิศจากคำสั่งที่ไฟล์ที่ชื่อว่าfind{}.svn

ความคิดใด ๆ

คำตอบ:


36

คุณสามารถทำการเปลี่ยนเส้นทางแบบนี้:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh -c 'svnadmin dump {} > {}.svn' \;

และจะทำการทดแทนที่ถูกต้อง


นี่คือข้อบกพร่องและการปฏิบัติที่ไม่ดี เปรียบเทียบคำตอบของฉันนี้ วิธีที่ถูกต้องคือการผ่าน{}เป็นอาร์กิวเมนต์ไปยังshแล้ว (ภายในsh) ดูเป็น"$0"หรือ"$1"หรือดังนั้น
Kamil Maciorowski

5

ไม่ แต่คุณสามารถเขียนสคริปต์ทุบตีง่าย ๆ เพื่อเรียกใช้จากการค้นหาได้
ตัวอย่าง ( /tmp/dump.sh ):

#!/bin/sh
svn admin dump "$1" > "$1".svn

แล้ว:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.