Lista de archivos de más de {tamaño} ordenados por fecha

27

Quiero resolver el problema 'enumere los 10 archivos más recientes en el directorio actual de más de 20 MB'.

Con lo lsque puedo hacer:

ls -Shal |head

para obtener los 10 archivos más grandes y:

ls -halt |head

para obtener los 10 archivos más recientes

Con find puedo hacer:

find . -size +20M

Para enumerar todos los archivos de más de 20 MB en el directorio actual (y subdirectorios, que no quiero).

¿Hay alguna manera de enumerar los diez archivos más recientes de más de un tamaño determinado, preferiblemente usando ls?

EoghanM
fuente

Respuestas:

24

La opción 'directorio actual' para findes -maxdepth 1. Toda la línea de comandos para sus necesidades es:

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

o

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head
Rajish
fuente
8

Nota: Esto funcionará para GNU-find, pero no para todos los demás.

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

Comenzando como @Rajish, pero usando el printfcomando from findpara especificar el formato de salida. Hay 3 formatos relacionados con el tiempo, atime, ctime y mtime : %Tes para mtime %Ay %Cson para los otros formatos.

@es especificar el formato de tiempo en segundos desde época. %fes para el nombre del archivo, \npara una nueva línea entre 2 archivos.

Luego, ordenar por número en orden inverso da primero los archivos más jóvenes, y tomamos 20 líneas¹ con head.

Al final, sedse usa, para tirar la información del tiempo.

¹) dado que headfunciona línea por línea, un solo archivo con más de 20 líneas nuevas en el nombre, lo cual es un poco inusual, pero no está prohibido, puede dañar la salida si pertenece a las primeras 20 coincidencias. Si tiene esos archivos, intente deshacerse de ellos, bueno, cambie su nombre. A menudo serán un problema para los guiones simples.

usuario desconocido
fuente
1
Si utiliza file's -lscomando, los caracteres especiales se imprimirán como personajes escapados: find . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'. Además, se verá el formato ls -l, EoghanM también especificó de -ltodos modos.
manatwork
printfsolo funciona para distribuciones específicas de GNU.
Brethlosze
%T+genera marcas de tiempo legibles para humanos como las 2018-11-06+13:37:54.4606466460que también se pueden ordenar por sort(sin -n), ver: unix.stackexchange.com/questions/29899/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
5

Los calificadores globales de Zsh lo hacen fácil. El .calificador selecciona solo archivos normales, Lm+20selecciona archivos que tienen al menos 20 MB más un byte de largo; para incluir archivos que tengan exactamente 20 MB de largo, use L+20971519. Luego omordena disminuyendo el tiempo de modificación y [1,10]restringe la expansión a los primeros 10 partidos. Aún necesita la -topción lssi desea enumerar los archivos por fecha; o puede pasar los archivos a algún otro comando (el más joven primero). Para pasar los archivos a otro comando con el archivo más antiguo primero, use Ompara ordenar aumentando el tiempo de modificación y [-10,-1]extraer las últimas 10 coincidencias.

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])
Gilles 'SO- deja de ser malvado'
fuente
2

Creo que esta podría ser una mejor manera de resolver el problema ...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

Para deshacerse de cualquier error mientras find intenta acceder a archivos que no tiene permiso para leer, es posible que desee agregar

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 
Dominic Williams
fuente
1

Esto imprimirá solo los 10 archivos especificados, independientemente de cualquier carácter de nueva línea incrustado en los nombres de archivo. Utiliza sistema de archivosinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done
Peter.O
fuente
-1

Gracias por todas las respuestas. Lo que busqué es lo siguiente:

ls -halt | grep "M " |head

Aunque renuncia a los 20 megabytes a favor de cualquier cosa por encima de un megabyte (y menos de un gigabyte), es fácil de recordar y conserva el elemento legible para los humanos de los tamaños de archivo.

EoghanM
fuente
44
Usted debe no intentar analizar la salida de ls, se muestra una representación de archivos, nada más. Para nombres de archivo simples, la salida en su mayoría es equivalente al nombre del archivo, pero no debe confiar en él.
Chris Down
Es cierto, estoy seguro, pero en términos de un usuario humano (y la salida no se canaliza a otro lado), este es más fácil de recordar, ya que se puede armar más fácilmente a partir de herramientas simples conocidas tldp.org/LDP/GNU-Linux- Herramientas-Resumen / html / c1089.htm
EoghanM