Excluir un directorio del comando `ls -R` en FreeBSD
0
Quiero enumerar todos mis archivos en un directorio en FreeBSD 9.2, pero no quiero incluir un directorio específico. Verifiqué ambos parámetros -Iy , pero solo ignora el modo de superusuario y no es compatible.--ignorelsI--ignore
¿Alguien tiene una idea de cómo usar lso hacer eso usando otro comando (como grep)?
Si desea enumerar todos los archivos excepto aquellos dentro de un determinado directorio, por ejemplo, notHerepuede usar el findcomando para hacerlo como
find .-path ./notHere -prune -o -type f -print
Explicación:
.: el directorio para iniciar el finden
-path ./notHere: comienza una regla que coincidirá con la ruta ./notHere
-prune: evitar que finddescienda al directorio con la coincidencia actual
-o: agregue un orpara especificar qué queremos que suceda si la primera regla no coincide
-type f: solo coincide con archivos, no, digamos, directorios (elimine esto si desea ver también las entradas del directorio)
-print: a menudo no es necesario ya que es la acción predeterminada, pero algunas versiones de findtodavía quieren que diga expresamente que desea que se imprima el resultado
Usted menciona querer otro resultado (específicamente ls -ll) que no sea solo la lista de nombres de archivo. finda menudo tiene una función incorporada para ayudar con eso, aunque no esas opciones específicas para hacerlo ls. Puede reemplazar la -printbandera anterior con -lsy ver si ese conjunto de lsopciones está lo suficientemente cerca para usted:
find .-path ./notHere -prune -o -type f -ls
o si eso no es lo suficientemente bueno, podría haber findejecutado el comando que desea en lugar de intentar procesar la salida por separado como:
find .-path ./notHere -prune -o -type f -exec ls -ll {}+
No mencioné que necesito información de archivo, por lo tanto, su respuesta es la respuesta. Sin embargo, ¿qué debo hacer para obtener la información de cada archivo, como el tamaño y la fecha? (Necesito una salida como ls -ll. Sé que puedo enviar el resultado de búsqueda a un script de shell que contiene un while, pero creo que sería muy lento.
Neyman
Muchas versiones findincluso tienen una -lsque puedes usar en lugar de -print. La página de manual de Freebsd dice -lsque dará resultados como los ls -dgilsque podrían ser lo suficientemente cercanos para usted. De lo contrario, podría reemplazar -printcon el -exec ls -ll {} +que debería ser más rápido que tratar de procesar toda la salida manualmente con un whilebucle
Eric Renouf
Eso es exactamente lo que quiero. Sin embargo, no puedo hacer +1 todavía;)
Neyman
1
Utilizo este script para filtrar todas las carpetas con nombres que comienzan con '_'. Probablemente no funcionará con carpetas que tengan espacios, pero podría modificarlo.
ls -la | grep -v "skip folder"solo omite el nombre del directorio y su contenido permanece. Incluso utilicé ls -ll | pcregrep --color -v -M "directoryAddress(\n|.)*nextDirectoryFullAddress", lo que omite toda la lista. Sin embargo, no considero que sea una buena respuesta, porque la estructura del directorio puede cambiar (es decir, se puede agregar otra lista entre ellos) y se pierden algunos datos.
Neyman
Su pregunta es un poco confusa, ¿desea enumerar directorios de forma recursiva? Si desea enumerar todos los archivos en todos los directorios, excepto uno, lo mejor es findque puede seleccionar nombres específicos en función de la ruta, por ejemplo:find . | grep -v .ssh/id_rsa
ls -ll
. Sé que puedo enviar el resultado de búsqueda a un script de shell que contiene unwhile
, pero creo que sería muy lento.find
incluso tienen una-ls
que puedes usar en lugar de-print
. La página de manual de Freebsd dice-ls
que dará resultados como losls -dgils
que podrían ser lo suficientemente cercanos para usted. De lo contrario, podría reemplazar-print
con el-exec ls -ll {} +
que debería ser más rápido que tratar de procesar toda la salida manualmente con unwhile
bucleUtilizo este script para filtrar todas las carpetas con nombres que comienzan con '_'. Probablemente no funcionará con carpetas que tengan espacios, pero podría modificarlo.
En general, la parte que es interesante es esta:
La expresión regular
_[a-z0-9]*
contiene el patrón para que coincida con el nombre que debe excluirse.Esto es si desea listas de carpetas sin la
-a
opción (solo nombres). Si desea usar,-a
entonces el más simple es:¿Dónde
skip_folder
está el nombre que desea excluir? Use comillas si la carpeta contiene espacios, por ejemplo:fuente
ls -la | grep -v "skip folder"
solo omite el nombre del directorio y su contenido permanece. Incluso utilicéls -ll | pcregrep --color -v -M "directoryAddress(\n|.)*nextDirectoryFullAddress"
, lo que omite toda la lista. Sin embargo, no considero que sea una buena respuesta, porque la estructura del directorio puede cambiar (es decir, se puede agregar otra lista entre ellos) y se pierden algunos datos.find
que puede seleccionar nombres específicos en función de la ruta, por ejemplo:find . | grep -v .ssh/id_rsa