2011-02-14 18 views
52

Así que aquí está el trato. Digamos que tengo un directorio llamado "web", por loen la terminal de Linux, ¿cómo muestro la última fecha de modificación de la carpeta teniendo en cuenta su contenido?

$ ls -la 

drwx------ 4 rimmer rimmer 4096 2010-11-18 06:02 web 

pero dentro de este directorio, web/php/

$ ls -la 

-rw-r--r-- 1 rimmer rimmer 1957 2011-01-05 08:44 index.php 

Esto significa que a pesar de que el contenido de mi directorio,/web/php /index.php ha sido modificado por última vez en 2011-01-05, el directorio/web/se informa como la última modificación en 2010-11-18.

Lo que debo hacer es informar la última fecha de modificación de mi/web/directorio como la última fecha de modificación de cualquier archivo/directorio dentro de este directorio, recursivamente.

¿Cómo puedo hacer esto?

+1

I ' Es curioso por qué piensas que necesitas hacer esto. –

Respuesta

47

Algo así como:

find /path/ -type f -exec stat \{} --printf="%y\n" \; | 
    sort -n -r | 
    head -n 1 

Explicación:

  • el comando find se imprimirá la fecha de modificación de cada archivo haciendo caso omiso de forma recursiva directorios (de acuerdo con el comentario de IQAndreas no se puede confiar en las carpetas marcas de tiempo)
  • tipo -N (numéricamente) -r (inverso)
  • cabeza -n 1: obtener la primera entrada
+2

tengo que amarrar tuberías ... – grisaitis

+1

De acuerdo con [la documentación de coreutils] (https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html#head-invocation), podría considerar 'head -n 1' o 'sed 1q' en lugar de la sintaxis obsoleta. – sappjw

+1

Así 'cabeza -1' para devolver solo la primera línea ahora está obsoleto ... Hombre, recuerdo cuando solía ser la nueva bandera - ¡¡¡soy tan viejo !!!: o) –

5

Si pudiera, votaría la respuesta de Paulo. Lo probé y entendí el concepto. Puedo confirmar que funciona El comando find puede generar muchos parámetros. Por ejemplo, añada lo siguiente a la --printf cláusula:

%a for attributes in the octal format 
%n for the file name including a complete path 

Ejemplo:

find Desktop/ -exec stat \{} --printf="%y %n\n" \; | sort -n -r | head -1 
2011-02-14 22:57:39.000000000 +0100 Desktop/new file 

Permítanme plantear esta cuestión, así: ¿El autor de esta pregunta quieren resolver su problema usando Bash o PHP? Eso debe ser especificado.

+2

Buena pregunta, pensé que era obvio, ya que mis etiquetas dicen "bash, scripting, shell". Quiero resolver este problema usando Bash, sí. Es para hacer una copia de seguridad de los archivos del servidor. Creo que el problema está resuelto ahora, las soluciones funcionan perfectamente :) –

+0

Pareces estar usando * both * 'stat' y el indicador' -printf' incorporado de 'find', y básicamente descartando uno de los resultados . Supongo que deberías preferir este último al anterior, como se describe en una respuesta separada (no es necesario generar un proceso separado para cada archivo cuando 'find' ya lo hace todo en un solo proceso). – tripleee

17

Si tiene una versión de find (como GNU find) que soporta -printf entonces no hay necesidad de llamar a stat en repetidas ocasiones:

find /some/dir -printf "%T+\n" | sort -nr | head -n 1 

o

find /some/dir -printf "%TY-%Tm-%Td %TT\n" | sort -nr | head -n 1 

Si no es necesario recursión, sin embargo:

stat --printf="%y\n" * 
Cuestiones relacionadas