Quiero enumerar todos los archivos de registro que no pertenecen hoy y solo los archivos que contienen 2015
en sus nombres.
Estos son los comandos que he probado:
find . -name 2015 -mtime +1 -exec ls -ltrh {} \;
find . -name *2015* -mtime +1 -exec ls -ltrh {} \;
La salida de ambos no es nada, pero aún así, los archivos están ahí. Algo está mal con estos comandos, y no entiendo qué. Cualquier ayuda sería apreciada.
command-line
find
rɑːdʒɑ
fuente
fuente
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 ...)2015
su nombre (la otra deficiencia obvia de la forma en que se escribe el comando) sospecho que habría algún tipo de salida. Por lo tanto, es posible que desee publicar una respuesta al respecto.Respuestas:
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 exactamente2015
, 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 afind
.Si hay archivos directamente contenidos en el directorio actual (en el que estaba cuando ejecutó ese
find ...
comando) cuyos nombres contienen2015
(y no comienzan con a.
), el shell se expandió*2015*
en una lista de esos nombres de archivo, luego pasó esa lista como argumentos parafind
. Esto no es lo que desea, en su lugar, desea pasar*2015*
literalmente como un argumento para encontrar, de modo quefind
, 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:\
puede dificultar ver exactamente lo que el shell pasa alfind
comando."
veces implica reglas algo complicadas .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: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
: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 confind
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.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 :fuente
newerXY
sintaxis, que acepta argumentos de calendario, por ejemplo,-newermt 'yesterday'
y! -newermt 'yesterday'
Cita la expresión y te sugiero que también comas los corchetes
o
no necesita pasar los archivos que encuentre a ls
fuente
-type f
? Y sils
tiene que ser usado, sugiera usarlo-ls
.En zsh , puede usar calificadores glob (esta es una característica única de zsh, no disponible en otros shells como bash).
Esto solo enumera los archivos en el directorio actual; para recorrer directorios recursivamente , use
Con
find
,-name 2015
solo encuentra archivos cuyo nombre es exactamente2015
.-name *2015*
solo funciona si no hay archivos cuyo nombre contenga2015
en el directorio actual, porque el shell expande el patrón*2015*
antes de quefind
se invoque. Necesita citar el patrón:Tenga en cuenta que ambos
find -mtime +1
y zsh*(m+1)
encuentran archivos que tienen al menos 48 horas de antigüedad , no archivos más antiguos que hoy. El signo más significa "estrictamente más que" y el número de días se redondea hacia abajo. Para buscar archivos que tengan al menos 24 horas de antigüedad, use-mtime +0
o(m+0)
.Si desea buscar archivos que se modificaron por última vez ayer o antes , puede usar
find
el-newermt
predicado :No hay una forma realmente conveniente de hacer esta prueba en zsh.
fuente