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?
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écialefind
- lisez la page de manuel pour en savoir plus. Je pense quetouch -c ./*/
cela fonctionnerait aussi.-maxdepth 1
à la commande, afin que celafind
ne soit pas récurrent dans les sous-dossiers. OP semble vouloir toucher uniquement les dossiers du cwd, pas les sous-dossiers.Essayer
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 latouch
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-à-direVoir aussi les bonnes références dans la réponse de jasonwryan ainsi que celle- ci .
la source
find . -type d -maxdepth1 -print0 | xargs -0 touch
, ou à la réponse de MichaelMrozek ci-dessus.Vous ne
ls
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.htmlQuelque chose comme ça pourrait réaliser ce que vous recherchez:
Voir les deux premiers pièges de Bash pour une explication plus approfondie.
la source
touch ./*
devrait fonctionner dans la plupart des cas. Il n'y a vraiment pas besoin de lafor
boucle cartouch
peut prendre plusieurs fichiers, et vous devez./
gérer les fichiers avec des noms comme--help
correctement. Ceci est une bonne ressource sur le sujet.*
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 viashopt -s dotglob
.la source