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 touch
semua 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 find
implementasi 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
, fish
atau Thompson shell (yang akan melaporkan kesalahan sebagai gantinya). Di sini, kami menggunakan -c
untuk mengatasinya, meskipun itu masih bisa touch
disebut file non-direktori *
.Dengan zsh
, touch
hanya untuk direktori, termasuk yang tersembunyi:
touch -- *(D/)
{} \+
khusus find
sintaks - baca halaman manual untuk lebih. Saya pikir touch -c ./*/
akan bekerja juga.
-maxdepth 1
ke perintah, sehingga find
tidak berulang menjadi subfolder. OP tampaknya hanya ingin menyentuh folder-folder itu di cwd, bukan subfolder.
Mencoba
touch ./*
Itu menghindari for
loop 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 touch
sebagian besar implementasi memiliki -c
opsi (juga disebut --no-create
dalam 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 for
loop karena touch
dapat mengambil banyak file, dan Anda perlu ./
untuk menangani file dengan nama seperti --help
dengan 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 dotglob
opsi shell via shopt -s dotglob
.