J'essaie de mettre à jour les horodatages de tous les dossiers du cwd en utilisant ceci:
for file in `ls`; do touch $file; done
Mais cela ne semble pas fonctionner. Des idées pourquoi?
J'essaie de mettre à jour les horodatages de tous les dossiers du cwd en utilisant ceci:
for file in `ls`; do touch $file; done
Mais cela ne semble pas fonctionner. Des idées pourquoi?
Réponses:
Jusqu'à présent, toutes les réponses (ainsi que votre exemple dans la question) supposent que vous voulez touchtout dans le répertoire, même si vous avez dit "toucher tous les dossiers". S'il s'avère que le répertoire contient des fichiers et des dossiers et que vous souhaitez uniquement mettre à jour les dossiers, vous pouvez utiliser find:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
Ou si votre findapplication ne supporte pas les non-standard -mindepth/ -maxdepthprédicats:
$ find . ! -name . -prune -type d -exec touch {} +
Cette:
$ touch -c -- */
Devrait fonctionner dans la plupart des coquilles sauf que:
touch liens symboliques vers des répertoires en plus des répertoires ordinaires*dans des coquilles autres que csh, tcsh, zsh, fishou la coquille Thompson (qui signale une erreur à la place). Ici, nous utilisons -cpour contourner cela, bien que cela puisse toujours être touchun fichier non-répertoire appelé *.Avec zsh, vers les touchrépertoires uniquement, y compris les répertoires masqués:
touch -- *(D/)
{} \+est spéciale find- lisez la page de manuel pour en savoir plus. Je pense que touch -c ./*/cela fonctionnerait aussi.
-maxdepth 1à la commande, afin que cela findne soit pas récurrent dans les sous-dossiers. OP semble vouloir toucher uniquement les dossiers du cwd, pas les sous-dossiers.
Essayer
touch ./*
Il évite la forboucle inutile qui engendrerait un nouveau processus pour chaque fichier unique et fonctionne pour tous les noms de fichiers, même ceux avec des espaces ou ceux qui ressemblent à des options (comme -t). La seule fois où cela ne fonctionnera pas, c'est si vous n'avez aucun fichier (non point) dans le répertoire, auquel cas vous finirez par créer un fichier nommé *. Pour éviter cela, pour le cas spécifique de la touchplupart des implémentations, vous avez une -coption (également appelée --no-createdans les versions GNU) pour ne pas créer de fichiers inexistants, c'est-à-dire
touch -c ./*
Voir aussi les bonnes références dans la réponse de jasonwryan ainsi que celle- ci .
Vous nels devez pas essayer d'analyser la sortie de .
En outre, vous devez citer votre "$file"pour capturer n'importe quel espace blanc. Voir http://www.grymoire.com/Unix/Quote.html
Quelque chose comme ça pourrait réaliser ce que vous recherchez:
for file in *; do touch "$file"; done
Voir les deux premiers pièges de Bash pour une explication plus approfondie.
*ne capture pas les fichiers et répertoires dont le nom commence par un point. Une façon de résoudre ce problème consiste à activer l' dotgloboption shell via shopt -s dotglob.