Sto cercando di aggiornare i timestamp di tutte le cartelle nel CWD usando questo:
for file in `ls`; do touch $file; done
Ma non sembra funzionare. Qualche idea sul perché?
Sto cercando di aggiornare i timestamp di tutte le cartelle nel CWD usando questo:
for file in `ls`; do touch $file; done
Ma non sembra funzionare. Qualche idea sul perché?
Risposte:
Tutte le risposte finora (così come il tuo esempio nella domanda) presumono che tu voglia touch
tutto nella directory, anche se hai detto "tocca tutte le cartelle". Se risulta che la directory contiene file e cartelle e si desidera aggiornare solo le cartelle, è possibile utilizzare find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
O se l' find
implementazione non supporta i non standard -mindepth
/ -maxdepth
predicati:
$ find . ! -name . -prune -type d -exec touch {} +
Questo:
$ touch -c -- */
Dovrebbe funzionare nella maggior parte delle shell tranne che:
touch
collegherà anche a directory in aggiunta a directory semplici*
in gusci diversi csh
, tcsh
, zsh
, fish
o il guscio Thompson (che segnalare un errore, invece). Qui, stiamo usando -c
per aggirare il problema, anche se potrebbe ancora essere touch
chiamato un file non di directory *
.Con zsh
, touch
solo per le directory, comprese quelle nascoste:
touch -- *(D/)
{} \+
è speciale find
sintassi - leggi la pagina man per di più. Penso touch -c ./*/
che funzionerebbe anche.
-maxdepth 1
nel comando, in modo che find
non ricorra nelle sottocartelle. OP sembra voler toccare solo quelle cartelle nel CWD, non le sottocartelle.
Provare
touch ./*
Evita il for
ciclo non necessario che genererebbe un nuovo processo per ogni singolo file e funziona per tutti i nomi di file, anche quelli con spazi o quelli che sembrano opzioni (come -t
). L'unica volta in cui non funzionerebbe è se non ci sono file (non punti) nella directory, nel qual caso finiresti per creare un file chiamato *
. Per evitare ciò, per il caso specifico della touch
maggior parte delle implementazioni è disponibile -c
un'opzione (chiamata anche --no-create
nelle versioni GNU) per non creare file inesistenti, ovvero
touch -c ./*
Vedi anche i riferimenti buone della risposta di jasonwryan così come questo uno .
Non dovresti tentare di analizzare l'output dils
.
Inoltre, dovresti citare il tuo "$file"
per catturare qualsiasi spazio bianco. Vedi http://www.grymoire.com/Unix/Quote.html
Qualcosa del genere potrebbe ottenere ciò che cerchi:
for file in *; do touch "$file"; done
Vedi le prime due insidie di Bash per una spiegazione più approfondita.
*
non acquisisce file e directory il cui nome inizia con un punto. Un modo per risolvere questo è abilitare l' dotglob
opzione shell tramite shopt -s dotglob
.