Saya mencoba memperbarui cap waktu semua folder di cwd menggunakan ini:
for file in `ls`; do touch $file; done
Tapi sepertinya itu tidak berhasil. Ada ide kenapa?
Saya mencoba memperbarui cap waktu semua folder di cwd menggunakan ini:
for file in `ls`; do touch $file; done
Tapi sepertinya itu tidak berhasil. Ada ide kenapa?
Jawaban:
Semua jawaban sejauh ini (dan juga contoh Anda dalam pertanyaan) mengasumsikan bahwa Anda ingin touchsemua yang ada di direktori, meskipun Anda mengatakan "sentuh semua folder". Jika ternyata direktori berisi file dan folder dan Anda hanya ingin memperbarui folder, Anda dapat menggunakan find:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Atau jika findimplementasi Anda tidak mendukung predikat non-standar -mindepth/ -maxdepth:
$ find . ! -name . -prune -type d -exec touch {} +
Ini:
$ touch -c -- */
Harus bekerja di sebagian besar cangkang kecuali bahwa:
touch symlink ke direktori di samping direktori polos*dalam kerang selain csh, tcsh, zsh, fishatau Thompson shell (yang akan melaporkan kesalahan sebagai gantinya). Di sini, kami menggunakan -cuntuk mengatasinya, meskipun itu masih bisa touchdisebut file non-direktori *.Dengan zsh, touchhanya untuk direktori, termasuk yang tersembunyi:
touch -- *(D/)
{} \+khusus findsintaks - baca halaman manual untuk lebih. Saya pikir touch -c ./*/akan bekerja juga.
-maxdepth 1ke perintah, sehingga findtidak berulang menjadi subfolder. OP tampaknya hanya ingin menyentuh folder-folder itu di cwd, bukan subfolder.
Mencoba
touch ./*
Itu menghindari forloop yang tidak perlu yang akan menelurkan proses baru untuk setiap file tunggal dan bekerja untuk semua nama file, bahkan yang dengan spasi atau yang terlihat seperti opsi (seperti -t). Satu-satunya waktu itu tidak akan berhasil adalah jika Anda tidak memiliki file (non-dot) di direktori dalam hal ini Anda akhirnya akan membuat file bernama *. Untuk menghindari itu, untuk kasus tertentu touchsebagian besar implementasi memiliki -copsi (juga disebut --no-createdalam versi GNU) untuk tidak membuat file yang tidak ada, yaitu
touch -c ./*
Lihat juga referensi yang baik dalam jawaban jasonwryan ini serta ini salah satu .
Anda seharusnya tidak mencoba mem-parsing output darils .
Juga, Anda harus mengutip Anda "$file"untuk menangkap spasi. Lihat http://www.grymoire.com/Unix/Quote.html
Sesuatu seperti ini mungkin mencapai apa yang Anda cari:
for file in *; do touch "$file"; done
Lihat dua Bash Pitfalls pertama untuk penjelasan yang lebih menyeluruh.
touch ./*harus bekerja dalam banyak kasus. Benar-benar tidak perlu untuk forloop karena touchdapat mengambil banyak file, dan Anda perlu ./untuk menangani file dengan nama seperti --helpdengan benar. Ini adalah sumber yang bagus untuk masalah ini.
*tidak menangkap file dan direktori yang namanya dimulai dengan titik. Salah satu cara untuk memperbaikinya adalah dengan mengaktifkan dotglobopsi shell via shopt -s dotglob.