Quiero encontrar todos los archivos por longitud de los nombres de archivo.
Por ejemplo, si quiero encontrar archivos de longitud 1, como por ejemplo a.go
, b.go
.
Puse:
grep '.\{1\}' file
Pero esto no funciona. ¿Qué comando puedo usar para buscar archivos por longitud de nombre de archivo?
a.go
es un nombre de archivo de longitud 4.a
es un nombre de archivo de longitud 1. Esto es Unix, no DOS, donde el nombre y la extensión estaban separados y.
siempre había una parte implícita del nombre de archivo.Respuestas:
grep
busca patrones en el contenido de los archivos. Si desea ver los nombres de los archivos, puede usar un globo de shell (si desea considerar solo los nombres de archivo en el directorio actual):(Por cierto, es el shell el que evalúa el glob, no el
echo
comando).Si desea buscar en los directorios de forma recursiva, comenzando con el directorio actual, la herramienta a utilizar es
find
:(Tenga en cuenta que debe citar el patrón para evitar que el shell lo evalúe como un globo antes de que
find
se invoque).fuente
Si solo desea encontrar los nombres de archivo, puede usar el siguiente comando:
Eso se ejecutará
find
, extrayendo el nombre del archivo o directorio usandobasename
y luego buscando cualquier nombre de archivo o nombre de directorio que tenga al menos 100 caracteres. Si desea encontrar un nombre de archivo de una longitud exacta, use en{100}
lugar de{100,}
.Si desea encontrar los nombres de archivo, incluida la ruta, haga lo siguiente:
Esto devolverá el nombre del archivo, incluida la ruta relativa a donde ejecutó el comando de búsqueda.
fuente
En primer lugar,
grep
busca a través del contenido de los archivos, no buscará los nombres de los archivos. Por eso que quieresfind
. No tiene una opción para establecer la longitud del nombre de archivo, pero puede analizar su salida para obtener lo que desea. Aquí hay algunos ejemplos que ejecuto en un directorio que contiene los siguientes archivos:La búsqueda de archivos en este directorio devuelve:
Entonces, para encontrar los archivos con una longitud de X, necesitaremos eliminar la ruta y hacer coincidir solo los caracteres después del último
/
:El
sed
comando simplemente elimina el./
. La-P
bandera activa Expresiones regulares compatibles con Perl que son necesarias para lo{n}
que es una cosa PCRE y los$
medios "coinciden con el final de la cadena".También podría simplemente hacer esto:
Eso está bien para números pequeños que escriben 15 puntos para que coincidan con nombres de archivo de longitud 15 no es muy eficiente.
Finalmente, si desea ignorar la extensión y hacer coincidir solo el nombre del archivo, haga esto (como sugirió @slm):
Sin embargo, esto también encontrará archivos como
a.bo.go
. Esto es mejor si sus nombres de archivo pueden contener más de uno.
:NOTA: La solución anterior supone que tiene nombres de archivo relativamente sanos que no contienen nuevos caracteres de línea, etc. También contará no ignorar los espacios en los nombres de archivo al calcular la longitud que podría no ser la que desea. Si alguno de estos es un problema, avíseme y actualizaré mi respuesta.
fuente
No especificas, pero si los archivos están dentro de una estructura de directorios, puedes usarlos
find
para localizar archivos de longitud 1, con la ayuda degrep
:Ejemplo
fuente
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Tambiéngrep
tenga en cuenta que este Q no fue etiquetado como OSX, por lo que el uso de es apto.Yo usaría algo como esto.
Entonces, si pones dos "?" entonces está buscando nombres de archivo con dos caracteres y la extensión.
fuente
Cuando desee utilizar la expresión regular en el comando find, debe usar
""
como:para su caso use:
Debe reemplazar la ruta real con YourPath,
-a
mediosAnd
-type f
medios que sólo busca los archivos normales.?
en su consulta significa un carácter, como DOS, si lo recuerda.fuente
ls ?.*
debería darte los resultados deseados.fuente