IFS=$(echo -en "\n\b")
Karena Anda mengasumsikan shell dengan echo -e
, dan Anda memiliki bash di garis shebang Anda, Anda dapat menggunakannya IFS=$'\n\b'
. Membuat backspace pemisah agak aneh. Anda tidak perlu IFS
melakukan apa yang Anda lakukan.
OLDIFS=$IFS
...
IFS=$OLDIFS
Perhatikan bahwa ini mengembalikan nilai lama IFS
hanya jika IFS
awalnya ditetapkan. Jika IFS
awalnya tidak disetel, ini diset IFS
ke string kosong, yang sama sekali berbeda. Di ksh, bash atau zsh, jika Anda perlu mengatur IFS
sementara, Anda dapat menulis kode Anda dalam suatu fungsi dan membuat IFS
lokal ke fungsi ini. Di shell lain, Anda perlu berhati-hati tentang kasus yang tidak disetel.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
Jangan pernah menggunakan substitusi perintah pada output dari find
.
- Ini membagi output pada karakter dalam
$IFS
. Jika Anda mengatur IFS
ke baris baru, maka ini membagi output di baris baru, tetapi Anda masih tidak bisa menangani nama file yang mengandung baris baru.
- Tidak hanya hasil substitusi perintah yang dibagi menjadi kata-kata, tetapi kemudian setiap kata digunakan sebagai pola gumpalan. Jika Anda memanggil file
A[12].pdf
, A1.pdf
dan A2.pdf
, Anda akan berakhir dengan A1.pdf A2.pdf A1.pdf A2.pdf
. Anda dapat mematikan globbing dengan set -f
(dan kembali dengan set +f
), tetapi di sini (seperti kebanyakan waktu) cara yang tepat adalah tidak menggunakan substitusi perintah.
Gunakan -exec
argumen untuk find
(atau jika sistem Anda memiliki -print0
, Anda dapat menggunakan find … -print0 | xargs -0 …
sebagai gantinya; ini hanya berguna untuk bertindak pada banyak file sekaligus jika Anda memerlukan portabilitas ke sistem Linux kuno atau sistem OpenBSD saat ini yang memiliki -print0
tetapi tidak -exec … {} +
).
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
Perhatikan bahwa Anda kehilangan tanda kutip ganda di sekitar $f
(mereka tidak diperlukan jika ini adalah hasil pemisahan dan Anda belum berubah IFS
sejak saat itu dan globbing dimatikan, tapi sungguh, selalu menempatkan tanda kutip ganda kecuali Anda tahu mengapa Anda bisa ' t biarkan mereka hidup).
Ini kikuk dan non-portabel ( stat
tidak ada pada semua sistem, dan argumennya berbeda di berbagai sistem di mana ia ada). touch
memiliki opsi portabel untuk mengatur file ke timestamp dari file lain: touch -r REFERENCE_FILE FILE
. Saya akan merekomendasikan salah satu dari dua pendekatan:
- Jika Anda bisa, pertama-tama ubah file asli menjadi file baru, lalu panggil
touch -r
untuk mengatur tanggal file baru, dan akhirnya pindahkan file baru ke tempatnya. Lebih baik untuk memastikan output baik-baik saja sebelum sesuatu terjadi pada input; jika tidak, jika transformasi terputus karena alasan apa pun (mis. kegagalan daya), Anda akan kehilangan data.
- Jika transformasi adalah kotak hitam yang tidak dapat Anda kendalikan, Anda dapat menggunakan
touch -r
dua kali: sekali untuk menyimpan tanggal file asli pada file sementara yang kosong (yang akan dibuat secara otomatis), lalu sekali lagi setelah transformasi untuk mengembalikan tanggal. menggunakan file sementara.
Jadi:
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
tampaknya tidak biasa. Apakah Anda benar-benar ingin membagi pada backspace (\b
)? Lihat unix.stackexchange.com/questions/9496/… untuk beberapa tips.