Estoy tratando de actualizar las marcas de tiempo de todas las carpetas en el cwd usando esto:
for file in `ls`; do touch $file; done
Pero no parece funcionar. Alguna idea de por qué?
Estoy tratando de actualizar las marcas de tiempo de todas las carpetas en el cwd usando esto:
for file in `ls`; do touch $file; done
Pero no parece funcionar. Alguna idea de por qué?
Respuestas:
Todas las respuestas hasta el momento (así como su ejemplo en la pregunta) asumen que quiere touch
todo en el directorio, aunque haya dicho "tocar todas las carpetas". Si resulta que el directorio contiene archivos y carpetas y solo desea actualizar las carpetas, puede usar find
:
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
O si su find
implementación no admite los predicados -mindepth
/ no estándar -maxdepth
:
$ find . ! -name . -prune -type d -exec touch {} +
Esta:
$ touch -c -- */
Debería funcionar en la mayoría de los depósitos, excepto que:
touch
enlaces simbólicos a directorios además de directorios simples*
en los depósitos distintos csh
, tcsh
, zsh
, fish
o la cáscara de Thompson (que informar de un error en su lugar). Aquí, estamos usando -c
para solucionarlo, aunque todavía podría touch
llamarse un archivo que no sea de directorio *
.Con zsh
, touch
solo a directorios, incluidos los ocultos:
touch -- *(D/)
{} \+
especial es find
: lea la página del manual para obtener más información. Creo touch -c ./*/
que también funcionaría.
-maxdepth 1
el comando para que find
no se repita en subcarpetas. OP parece querer tocar solo esas carpetas en el cwd, no las subcarpetas.
Tratar
touch ./*
Evita el for
bucle innecesario que generaría un nuevo proceso para cada archivo y funciona para todos los nombres de archivos, incluso los que tienen espacios o los que parecen opciones (como -t
). El único momento en que no funcionaría es si no tiene archivos (que no sean puntos) en el directorio, en cuyo caso terminaría creando un archivo con el nombre *
. Para evitar eso, para el caso específico de la touch
mayoría de las implementaciones tenemos una -c
opción (también llamada --no-create
en versiones GNU) para no crear archivos inexistentes, es decir
touch -c ./*
Ver también las referencias buenas de la respuesta de jasonwryan así como este uno .
No debe intentar analizar la salida dels
.
Además, debe citar su "$file"
para capturar cualquier espacio en blanco. Ver http://www.grymoire.com/Unix/Quote.html
Algo como esto podría lograr lo que buscas:
for file in *; do touch "$file"; done
Vea las dos primeras trampas de Bash para una explicación más completa.
*
no captura archivos y directorios cuyo nombre comienza con un punto. Una forma de arreglar eso es habilitar la dotglob
opción de shell a través de shopt -s dotglob
.