¿Cómo puedo hacer un simple find
¿Cuál sería el orden de los resultados modificados más recientemente?
Aquí está la corriente find
Estoy usando (estoy haciendo un escape de shell en PHP, así que ese es el razonamiento de las variables):
find '$dir' -name '$str'\* -print | head -10
¿Cómo podría tener este pedido la búsqueda por última modificación? (Tenga en cuenta que no quiero que se clasifique después de la búsqueda, sino que busque los resultados según lo que se modificó más recientemente).
Respuestas:
Utilizar esta:
printf
argumentos deman find
:%Tk
: Última hora de modificación del archivo en el formato especificado pork
.@
: segundos desde el 1 de enero de 1970, 00:00 GMT, con parte fraccionaria.c
: fecha y hora del local (sáb 04 nov 12:02:33 EST 1989).%p
: Nombre del archivo.fuente
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Encuentra recursivamente todos los archivos que contienen el patrón del primer argumento pasado al comando (fr <pattern>
) y los clasifica con el último más reciente.find . -printf "%T@ %CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n
. Como se clasifica de forma natural, también se puede usar directamente en la clasificación:find . -printf "%CY-%Cm-%CdT%CH:%CM:%CS %p\n" | sort -n
El método más sencillo es usar zsh, gracias a su clasificatorios globales .
Si tiene una búsqueda GNU, haga que imprima los tiempos de modificación del archivo y ordénelos por orden.
Si tiene GNU find pero no otras utilidades de GNU, use nuevas líneas como separadores en lugar de nulos; perderá soporte para los nombres de archivo que contienen nuevas líneas.
Si tiene Perl (aquí asumiré que no hay nuevas líneas en los nombres de archivo):
Si tiene Python (también asumiendo que no hay nuevas líneas en los nombres de archivo):
Probablemente hay una manera de hacer lo mismo en PHP, pero no lo sé.
Si quieres trabajar solo con herramientas POSIX, es bastante más complicado; ver Cómo listar los archivos ordenados por fecha de modificación de forma recursiva (¡no hay un comando de estadísticas disponible!) (repatinar los primeros 10 es la parte fácil).
fuente
find
La versión muestra los archivos más antiguos, y que necesita agregar el-r
opción asort
.No necesitas PHP ni Python, solo ls :
Si el comando * sale con un estado de falla (es decir, Lista de argumentos demasiado larga ), entonces puedes iterar con encontrar. Parafraseado de: La longitud máxima de los argumentos para un nuevo proceso.
find . -print0|xargs -0 command
(optimiza la velocidad, si find no implementa "-exec +" pero sabe "-print0")find . -print|xargs command
(Si no hay espacio en blanco en los argumentos)Si la mayor parte de los argumentos consiste en rutas largas, absolutas o relativas, intente mover sus acciones al directorio:
cd /directory/with/long/path; command *
Y otra solución rápida puede ser unir menos argumentos:command [a-e]*; command [f-m]*; ...
fuente
Solo necesitas ls
Podrías hacerlo
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
como se indicó anteriormente,o
fuente
xargs
llamadasls
Varias veces, la clasificación se romperá.Extensible La respuesta de user195696 :
Para cada archivo, este primero genera la marca de tiempo numérica (para ordenar por, seguido de tabulación
\t
), luego una marca de tiempo legible por humanos, luego el tamaño del archivo (desafortunadamentefind
es-printf
no se puede hacer en mebibytes, solo kibibytes), luego el nombre del archivo con la ruta relativa.Entonces
sort -n
lo ordena por el primer campo numérico.Entonces
cut
se deshace de ese primer campo numérico que no es de interés para el usuario. (Imprime el segundo campo hacia adelante.) El separador de campo predeterminado es\t
o la tabulación.Ejemplo de salida:
Hice deliberadamente el tamaño del archivo de 6 caracteres, porque si lo hace más largo, es difícil distinguir visualmente qué tan grandes son los archivos. De esta manera, los archivos de más de 1e6 KiB sobresalen: por 1 char significa 1-9 GB, por 2 caracteres significa 10-99 GB, etc.
Edición: aquí hay otra versión (desde
find . -printf "%Tc"
se bloquea en MinGW / MSYS):Dando salida como:
Dónde:
-I{}
causa la ocurrencia de{}
para ser reemplazado por un argumento, y las nuevas líneas son ahora los separadores de argumentos (tenga en cuenta los espacios en los nombres de archivo anteriores).ls -G
suprime la impresión del nombre del grupo (pérdida de espacio).ls -h --si
produce tamaños de archivo legibles para el ser humano (más correctos con--si
).ls -t
ordena por tiempo, lo cual es irrelevante aquí, pero eso es lo que normalmente uso.fuente
T@
pors
en cualquiera de los comandos anteriores.Variante de OS X de la respuesta de @ user195696:
Con marca de tiempo:
Sin marca de tiempo:
fuente
Descubrí que esto hace el trabajo en Mac OS X (y lo suficientemente genérico para trabajar en otros Unixen también):
fuente
Si tu
find
La selección es muy simple, puede prescindir de ella, y simplemente usarls
:fuente
Tratar:
Pero también es útil filtrar los datos por
-mmin
/-mtime
y-type
.fuente
Utilizar:
Este comando ordenará los archivos por fecha de modificación.
Y mostrar como
fuente
No pienso
find
Tiene alguna opción para modificar el orden de salida.-mtime
y-mmin
le permitirá restringir los resultados a los archivos que se han modificado dentro de una ventana de tiempo determinada, pero la salida no se ordenará, tendrá que hacerlo usted mismo. ÑUfind
tiene un-printf
opción que, entre otras cosas, le permitirá imprimir la hora de modificación de cada archivo encontrado (cadenas de formato)%t
o%Tk
); Eso podría ayudarte a ordenar elfind
Salida de la manera que desee.fuente
Mejoré la respuesta de Akashs haciendo que el script manejara espacios en blanco en los nombres de archivos correctamente:
fuente
Si quieres ordenar todos los archivos PNG por tiempo en
$PWD
:Este sencillo de una sola línea da toda la flexibilidad de la expresión regular en
find
y enls
.fuente
Puedes usar
stat
en BSD y Linux (no en POSIX) de esta manera:Si quieres limitar el número:
fuente
Si solo desea obtener una ruta completa de cada elemento, puede anotar así.
Dónde
-printf "% T @% p \ n" para dar criterios de clasificación (fecha),
'sort -nr' para clasificar por fecha,
cabeza -10 para listar los 10 mejores resultados,
corte -d '' -f 2 para cortar la marca de tiempo principal en cada línea.
fuente
Tengo una solución simple.
Después
cd
a un directorio, usarfind . -iname "*" -ls
fuente