IFS=$(echo -en "\n\b")
เนื่องจากคุณสมมติว่าเปลือกด้วยecho -e
และคุณมีทุบตีในสาย shebang IFS=$'\n\b'
ของคุณอยู่แล้วคุณสามารถใช้ การทำให้ backspace เป็นตัวคั่นค่อนข้างแปลก คุณไม่ต้องการIFS
สิ่งที่คุณทำอยู่แล้ว
OLDIFS=$IFS
...
IFS=$OLDIFS
โปรดทราบว่าสิ่งนี้จะคืนค่าเก่าของIFS
เฉพาะถ้าIFS
ตั้งค่าเริ่มต้น หากIFS
ไม่มีการตั้งค่าเริ่มต้นชุดนี้IFS
จะเป็นสตริงว่างซึ่งแตกต่างอย่างสิ้นเชิง ใน ksh, bash หรือ zsh หากคุณจำเป็นต้องตั้งค่าIFS
ชั่วคราวคุณสามารถเขียนรหัสของคุณในฟังก์ชั่นและทำให้IFS
ท้องถิ่นฟังก์ชั่นนี้ ในเชลล์อื่นคุณต้องระวังเกี่ยวกับเคสที่ไม่ได้ตั้งค่า
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
find
ไม่เคยใช้แทนคำสั่งในการส่งออกของ
$IFS
กลุ่มนี้จะแบ่งการส่งออกที่ตัวละครในนั้น หากคุณตั้งค่าIFS
เป็นบรรทัดใหม่สิ่งนี้จะแยกเอาต์พุตที่บรรทัดใหม่ แต่คุณยังคงไม่สามารถจัดการชื่อไฟล์ที่มีบรรทัดใหม่ได้
- ไม่เพียง แต่ผลลัพธ์ของการแทนที่คำสั่งจะแบ่งออกเป็นคำต่าง ๆ แต่แต่ละคำจะถูกใช้เป็นรูปแบบกลม หากคุณไฟล์ที่เรียกว่า
A[12].pdf
, A1.pdf
และคุณจะจบลงด้วยA2.pdf
A1.pdf A2.pdf A1.pdf A2.pdf
คุณสามารถปิด globbing ด้วยset -f
(และกลับมาพร้อมกับset +f
) แต่ที่นี่ (เหมือนเวลาส่วนใหญ่) วิธีที่ถูกต้องคือไม่ใช้การทดแทนคำสั่ง
ใช้-exec
อาร์กิวเมนต์เพื่อfind
(หรือถ้าระบบของคุณมี-print0
คุณสามารถใช้find … -print0 | xargs -0 …
แทนได้สิ่งนี้มีประโยชน์สำหรับการดำเนินการกับหลาย ๆ ไฟล์พร้อมกันหากคุณต้องการความสะดวกในการพกพาไปยังระบบ Linux โบราณหรือระบบ OpenBSD ปัจจุบันที่มี-print0
แต่ไม่-exec … {} +
)
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
โปรดทราบว่าคุณไม่มีเครื่องหมายอัญประกาศคู่ล้อมรอบ$f
(ไม่จำเป็นถ้าสิ่งเหล่านี้เป็นผลลัพธ์ของการแยกและคุณไม่ได้เปลี่ยนIFS
ตั้งแต่นั้นมาและปิดการวนรอบ แต่จริงๆแล้วให้ใส่เครื่องหมายคำพูดคู่เสมอยกเว้นว่าคุณรู้ว่าทำไมคุณถึงสามารถ อย่าปล่อยไว้)
นี่คือเงอะงะและไม่ใช่พกพา ( stat
ไม่มีอยู่ในทุกระบบและข้อโต้แย้งนั้นแตกต่างกันไปตามระบบที่มีอยู่) มีตัวเลือกแบบพกพาในการตั้งค่าไฟล์เพื่อการประทับเวลาของไฟล์อื่น:touch
touch -r REFERENCE_FILE FILE
ฉันอยากจะแนะนำหนึ่งในสองวิธีแทน:
- หากคุณทำได้ก่อนอื่นให้แปลงไฟล์ต้นฉบับเป็นไฟล์ใหม่จากนั้นเรียกใช้
touch -r
เพื่อกำหนดวันที่ของไฟล์ใหม่และย้ายไฟล์ใหม่ไปไว้ในที่สุด มันจะดีกว่าเพื่อให้แน่ใจว่าผลลัพธ์ที่ดีก่อนที่จะมีอะไรเกิดขึ้นกับอินพุต; มิฉะนั้นหากการแปลงถูกขัดจังหวะด้วยเหตุผลใด ๆ (เช่นความล้มเหลวของพลังงาน) คุณจะสูญเสียข้อมูล
- หากการแปลงเป็นกล่องดำที่คุณไม่สามารถควบคุมได้คุณสามารถใช้
touch -r
สองครั้ง: หนึ่งครั้งเพื่อบันทึกวันที่ของไฟล์ต้นฉบับในไฟล์ชั่วคราวที่ว่างเปล่า (ซึ่งจะถูกสร้างขึ้นโดยอัตโนมัติ) จากนั้นอีกครั้งหลังจากการเปลี่ยนแปลงเพื่อกู้คืนวันที่ ใช้ไฟล์ชั่วคราว
ดังนั้น:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFS
ดูเหมือนผิดปกติ คุณต้องการแยกแบ็คสเปซ (\b
) จริงๆหรือ ดูunix.stackexchange.com/questions/9496/…สำหรับเคล็ดลับ