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 IFSmelakukan apa yang Anda lakukan.
OLDIFS=$IFS
...
IFS=$OLDIFS
Perhatikan bahwa ini mengembalikan nilai lama IFShanya jika IFSawalnya ditetapkan. Jika IFSawalnya tidak disetel, ini diset IFSke string kosong, yang sama sekali berbeda. Di ksh, bash atau zsh, jika Anda perlu mengatur IFSsementara, Anda dapat menulis kode Anda dalam suatu fungsi dan membuat IFSlokal 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 IFSke 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.pdfdan 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 -execargumen 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 -print0tetapi 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 IFSsejak 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 ( stattidak ada pada semua sistem, dan argumennya berbeda di berbagai sistem di mana ia ada). touchmemiliki 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 -runtuk 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 -rdua 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"' {} \;
IFStampaknya tidak biasa. Apakah Anda benar-benar ingin membagi pada backspace (\b)? Lihat unix.stackexchange.com/questions/9496/… untuk beberapa tips.