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é?
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 esfind
: lea la página del manual para obtener más información. Creotouch -c ./*/
que también funcionaría.-maxdepth 1
el comando para quefind
no se repita en subcarpetas. OP parece querer tocar solo esas carpetas en el cwd, no las subcarpetas.Tratar
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 latouch
mayoría de las implementaciones tenemos una-c
opción (también llamada--no-create
en versiones GNU) para no crear archivos inexistentes, es decirVer también las referencias buenas de la respuesta de jasonwryan así como este uno .
fuente
find . -type d -maxdepth1 -print0 | xargs -0 touch
, o la respuesta de MichaelMrozek anterior.No debe intentar analizar la salida de
ls
.Además, debe citar su
"$file"
para capturar cualquier espacio en blanco. Ver http://www.grymoire.com/Unix/Quote.htmlAlgo como esto podría lograr lo que buscas:
Vea las dos primeras trampas de Bash para una explicación más completa.
fuente
touch ./*
debería funcionar en la mayoría de los casos. Realmente no hay necesidad delfor
bucle ya quetouch
puede tomar múltiples archivos, y usted necesita./
manejar archivos con nombres como--help
correctamente. Este es un buen recurso sobre el tema.*
no captura archivos y directorios cuyo nombre comienza con un punto. Una forma de arreglar eso es habilitar ladotglob
opción de shell a través deshopt -s dotglob
.fuente