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?
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/)
{} \+
khususfind
sintaks - baca halaman manual untuk lebih. Saya pikirtouch -c ./*/
akan bekerja juga.-maxdepth 1
ke perintah, sehinggafind
tidak berulang menjadi subfolder. OP tampaknya hanya ingin menyentuh folder-folder itu di cwd, bukan subfolder.Mencoba
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 tertentutouch
sebagian besar implementasi memiliki-c
opsi (juga disebut--no-create
dalam versi GNU) untuk tidak membuat file yang tidak ada, yaituLihat juga referensi yang baik dalam jawaban jasonwryan ini serta ini salah satu .
sumber
find . -type d -maxdepth1 -print0 | xargs -0 touch
, atau jawaban MichaelMrozek di atas.Anda seharusnya tidak mencoba mem-parsing output dari
ls
.Juga, Anda harus mengutip Anda
"$file"
untuk menangkap spasi. Lihat http://www.grymoire.com/Unix/Quote.htmlSesuatu seperti ini mungkin mencapai apa yang Anda cari:
Lihat dua Bash Pitfalls pertama untuk penjelasan yang lebih menyeluruh.
sumber
touch ./*
harus bekerja dalam banyak kasus. Benar-benar tidak perlu untukfor
loop karenatouch
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 mengaktifkandotglob
opsi shell viashopt -s dotglob
.sumber