Quiero enumerar todos los archivos de registro que no pertenecen hoy y solo los archivos que contienen 2015en 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

findparte me parece bien, pero también tuve problemas con el-execpará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 ...)2015su 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 -lsprobablemente 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 alfindcomando."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 +1solo selecciona archivos modificados hace dos o más días.Como
man finddice:Supongamos que un archivo se modificó hace 47 horas. Para calcular cuántos períodos de 24 horas son,
findredondee hacia abajo : es un período de 24 horas atrás. Pero-mtime +1solo 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-execmaneja los nombres de archivos con espacios correctamente. Eso es falso: con{}o'{}',findobtiene 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
lscomando o (como ha sugerido muru ) lo reemplace confindla-lsacción.ls -ltrhprobablemente no está haciendo lo que pretendes porque se ejecuta por separado para cada archivo encontrado y, por lo tanto, los indicadores-ty-r, que especifican la clasificación, son irrelevantes.Aunque la salida tendrá un formato un poco diferente que con
ls -l, el uso-lses 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-printque se use la acción predeterminada :fuente
newerXYsintaxis, 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 silstiene 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 2015solo encuentra archivos cuyo nombre es exactamente2015.-name *2015*solo funciona si no hay archivos cuyo nombre contenga2015en el directorio actual, porque el shell expande el patrón*2015*antes de quefindse invoque. Necesita citar el patrón:Tenga en cuenta que ambos
find -mtime +1y 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 +0o(m+0).Si desea buscar archivos que se modificaron por última vez ayer o antes , puede usar
findel-newermtpredicado :No hay una forma realmente conveniente de hacer esta prueba en zsh.
fuente