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 touchtodo 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 findimplementació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, fisho la cáscara de Thompson (que informar de un error en su lugar). Aquí, estamos usando -cpara solucionarlo, aunque todavía podría touchllamarse un archivo que no sea de directorio *.Con zsh, touchsolo 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 1el comando para quefindno se repita en subcarpetas. OP parece querer tocar solo esas carpetas en el cwd, no las subcarpetas.Tratar
Evita el
forbucle 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 latouchmayoría de las implementaciones tenemos una-copción (también llamada--no-createen 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 delforbucle ya quetouchpuede tomar múltiples archivos, y usted necesita./manejar archivos con nombres como--helpcorrectamente. 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 ladotglobopción de shell a través deshopt -s dotglob.fuente