IFS=$(echo -en "\n\b")
Vì bạn đang giả định một vỏ với echo -evà dù sao bạn cũng có bash trong dòng shebang của mình, bạn có thể sử dụng IFS=$'\n\b'. Làm cho backspace một dải phân cách là khá kỳ lạ. Bạn không cần IFScho những gì bạn đang làm gì.
OLDIFS=$IFS
Giáo dục
IFS=$OLDIFS
Lưu ý rằng điều này khôi phục giá trị cũ IFSchỉ khi IFSđược đặt ban đầu. Nếu IFSban đầu không được đặt, bộ này đặt IFSthành chuỗi trống, hoàn toàn khác. Trong ksh, bash hoặc zsh, nếu bạn cần đặt IFStạm thời, bạn có thể viết mã của mình trong một hàm và đặt IFScục bộ cho hàm này. Trong các shell khác, bạn cần cẩn thận về trường hợp chưa đặt.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Không bao giờ sử dụng thay thế lệnh trên đầu ra của find.
- Điều này phân chia đầu ra tại các ký tự trong
$IFS. Nếu bạn đặt IFSthành một dòng mới, thì phần này sẽ chia đầu ra ở dòng mới, nhưng bạn vẫn không thể xử lý tên tệp có chứa dòng mới.
- Không chỉ là kết quả của sự thay thế lệnh được chia thành các từ, mà sau đó mỗi từ được sử dụng như một mẫu hình cầu. Nếu bạn gọi các tệp
A[12].pdf, A1.pdfvà A2.pdf, bạn sẽ kết thúc với A1.pdf A2.pdf A1.pdf A2.pdf. Bạn có thể tắt tính năng toàn cầu bằng set -f(và bật lại bằng set +f), nhưng ở đây (giống như hầu hết thời gian), cách đúng đắn là không sử dụng thay thế lệnh.
Sử dụng -execđối số để find(hoặc nếu hệ thống của bạn có -print0, bạn có thể sử dụng find … -print0 | xargs -0 …thay thế; điều này chỉ hữu ích khi hành động trên nhiều tệp cùng một lúc nếu bạn cần tính di động đối với các hệ thống Linux cổ hoặc các hệ thống OpenBSD hiện tại có -print0nhưng không -exec … {} +).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Lưu ý rằng bạn đang thiếu dấu ngoặc kép $f(chúng không cần thiết nếu đây là kết quả của việc chia tách và bạn đã không thay đổi IFSkể từ đó và tính năng toàn cầu bị tắt, nhưng thực sự, luôn đặt dấu ngoặc kép trừ khi bạn biết tại sao bạn có thể ' t để chúng trên).
Điều này là vụng về và không di động ( statkhông tồn tại trên tất cả các hệ thống và các đối số của nó là khác nhau trên các hệ thống khác nhau nơi nó tồn tại). touchcó một tùy chọn di động để đặt tệp thành dấu thời gian của tệp khác : touch -r REFERENCE_FILE FILE. Tôi muốn giới thiệu một trong hai cách tiếp cận thay thế:
- Nếu bạn có thể, trước tiên hãy chuyển đổi tệp gốc thành tệp mới, sau đó gọi
touch -rđể đặt ngày của tệp mới và cuối cùng di chuyển tệp mới vào vị trí. Tốt hơn là đảm bảo đầu ra tốt trước khi có bất cứ điều gì xảy ra với đầu vào; mặt khác, nếu quá trình chuyển đổi bị gián đoạn vì bất kỳ lý do nào (ví dụ như mất điện), bạn sẽ mất dữ liệu.
- Nếu phép chuyển đổi là một hộp đen mà bạn không có quyền kiểm soát, bạn có thể sử dụng
touch -rhai lần: một lần để lưu ngày của tệp gốc vào một tệp tạm thời trống (sẽ được tạo tự động), sau đó lại chuyển đổi để khôi phục ngày sử dụng tập tin tạm thời
Như vậy:
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"' {} \;
IFScó vẻ bất thường. Bạn có thực sự muốn phân chia trên backspace (\b)? Xem unix.stackexchange.com/questions/9496/ Kiếm để biết một số mẹo.