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 touch
tout 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 find
application ne supporte pas les non-standard -mindepth
/ -maxdepth
pré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
, fish
ou la coquille Thompson (qui signale une erreur à la place). Ici, nous utilisons -c
pour contourner cela, bien que cela puisse toujours être touch
un fichier non-répertoire appelé *
.Avec zsh
, vers les touch
ré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 find
ne 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 for
boucle 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 touch
plupart des implémentations, vous avez une -c
option (également appelée --no-create
dans 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' dotglob
option shell via shopt -s dotglob
.