IFS=$(echo -en "\n\b")
Vì bạn đang giả định một vỏ với echo -e
và 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 IFS
cho 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ũ IFS
chỉ khi IFS
được đặt ban đầu. Nếu IFS
ban đầu không được đặt, bộ này đặt IFS
thành chuỗi trống, hoàn toàn khác. Trong ksh, bash hoặc zsh, nếu bạn cần đặt IFS
tạm thời, bạn có thể viết mã của mình trong một hàm và đặt IFS
cụ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 IFS
thà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.pdf
và 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ó -print0
như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 IFS
kể 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 ( stat
khô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). touch
có 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 -r
hai 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"' {} \;
IFS
có 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.