El comando find . -name '*2015*' -mmin +1440 -ls
probablemente hará lo que quieras. Ver abajo para más detalles.
Tu primer comando tenía -name 2015
. No funcionó porque encuentra solamente archivos cuyos nombres son exactamente 2015
, sin otros personajes en ellos.
Su segundo comando, find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
podría haber fallado por un par de razones:
1. El shell expande los *
caracteres sin comillas y luego los pasa a find
.
Si hay archivos directamente contenidos en el directorio actual (en el que estaba cuando ejecutó ese find ...
comando) cuyos nombres contienen 2015
(y no comienzan con a .
), el shell se expandió *2015*
en una lista de esos nombres de archivo, luego pasó esa lista como argumentos para find
. Esto no es lo que desea, en su lugar, desea pasar *2015*
literalmente como un argumento para encontrar, de modo que find
, y no el shell, pueda encontrar qué archivos coinciden.
Para solucionar ese problema, cita *2015*
. Hay tres formas comunes de hacerlo:
'*2015*'
(es decir, find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
)
"*2015*"
(es decir, find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
)
\*2015\*
(es decir, find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;
)
Yo sugiero escribirlo entre comillas simples como '*2015*'
, debido a que:
Pero en este caso realmente no importa. '
y "
ambos tratan *
lo mismo y la expresión no es lo suficientemente complicada como para \
citarla y dificultar su comprensión.
2. -mtime +1
solo selecciona archivos modificados hace dos o más días.
Como man find
dice:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments
for -atime to understand how rounding affects the interpretation
of file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to
have been accessed at least two days ago.
Supongamos que un archivo se modificó hace 47 horas. Para calcular cuántos períodos de 24 horas son, find
redondee hacia abajo : es un período de 24 horas atrás. Pero -mtime +1
solo coincide con archivos cuyos tiempos de modificación son estrictamente más de un período de 24 horas atrás. Por lo tanto, los archivos de ayer no coinciden.
Consulte ¿Por qué find -mtime +1 solo devuelve archivos anteriores a 2 días? para más información, como lo sugiere steeldriver .
Para buscar archivos modificados por última vez en cualquier momento hace más de 24 horas , sugiero que lo estipule como hace 1440 minutos con -mmin +1440
:
find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;
Algunos lectores podrían preguntarse por qué no cité {}
. Algunas personas citan {}
para recordar a los humanos que no es una expresión para la expansión de aparatos ortopédicos . Las conchas de estilo Bourne (como bash ) no requieren {}
que se cite nada dentro. Quizás algún shell que no sea de Bourne lo trate especialmente; Esa podría ser la razón por la que algunos usuarios lo citan. Pero también hay una idea errónea de que a veces uno debe citar, {}
por lo que -exec
maneja los nombres de archivos con espacios correctamente. Eso es falso: con {}
o '{}'
, find
obtiene los mismos argumentos, ya que el shell elimina las comillas antes de pasar '{}'
afind
. Para contrarrestar esta idea errónea, no cito {}
, pero es una cuestión de estilo: si prefiere {}
documentar cómo no se trata el shell {
y }
, especialmente, está bien.
Le recomiendo que también cambie su ls
comando o (como ha sugerido muru ) lo reemplace con find
la -ls
acción. ls -ltrh
probablemente no está haciendo lo que pretendes porque se ejecuta por separado para cada archivo encontrado y, por lo tanto, los indicadores -t
y -r
, que especifican la clasificación, son irrelevantes.
Aunque la salida tendrá un formato un poco diferente que con ls -l
, el uso -ls
es más simple y fácil.
find . -name '*2015*' -mmin +1440 -ls
O si decide que realmente solo necesita enumerar los nombres del archivo (incluidas sus rutas, en relación con .
), simplemente puede especificar ninguna acción, lo que hace -print
que se use la acción predeterminada :
find . -name '*2015*' -mmin +1440
find
parte me parece bien, pero también tuve problemas con el-exec
parámetro. No pude hacer que eso funcione tampoco. (Estaba tratando de mover todos los archivos jpg de una carpeta a su directorio principal a través de él, y terminé haciéndolo manualmente ...)