Encuentra archivos en varios nombres de carpeta

44

Estoy intentando a la lista de todos los archivos de dir1, dir2, dir3y dir4que podría estar en cualquier parte como un subdirectorio de mi cwdusando el findcomando. Intenté lo siguiente sin éxito:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

Lo intenté posix-extendedtambién. ¿Cómo puedo enumerar estos archivos?

Aaron
fuente
encontrar . -type f -regextype sed -regex ". * / dir [1-4] / [a-z0-9] *" .. respuesta más corta hasta ahora :) ver la respuesta a continuación .. unix.stackexchange.com/a/390333 / 242983
alpha_989

Respuestas:

59

Y si desea buscar tres carpetas con el nombre foo, bary bazpara todos los *.pyarchivos, use este comando:

find foo bar baz -name "*.py"

así que si quieres mostrar archivos de dir1 dir2 dir3usofind dir1 dir2 dir3 -type f

prueba esto find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;

harish.venkat
fuente
Debería haberlo aclarado. Es posible que no tenga la ruta a los archivos que deseo buscar. Solo sé que son subdirectorios del directorio actual.
Aaron
use en ./dirlugar dedir
harish.venkat
Sin embargo, el directorio aún debería estar en el cwd, puede ser dos niveles más bajo (por ejemplo ./path/to/dir1), en cuyo caso ./dir1no existiría.
Aaron
editó la respuesta.
harish.venkat
8

Es mejor usar la directiva -path:

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

Lo que significa: encontrar todos los archivos en el directorio actual donde hay 'dir1' o 'dir2' o 'dir3' o 'dir4' en la ruta.

Mantenimiento periódico
fuente
Tienes el paréntesis en el lugar equivocado. Ver también -ay -opara el equivalente estándar de GNU's -and/ -or.
Stéphane Chazelas
4

Solo para que todos lo sepan. Agregar .*/antes de cada uno dirresolvió el problema, ya regexque parece coincidir con la ruta completa que parece.

Aaron
fuente
3

Esta es mi primera idea después de leer las respuestas anteriores:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

Esto tiene en cuenta que la expresión regular debe coincidir con el nombre de archivo completo y es más fácil de entender.

Ronin Tom
fuente
2

Muestra de búsqueda rápida (!) De archivos particulares (access_log) en múltiples ubicaciones definidas por comodines (directorio de inicio) y el directorio general de registro apache2 aplicando también el filtrado de nombres para excluir registros ssl y registros antiguos comprimidos. No responde directamente a la pregunta aquí, pero podría ser útil para alguien que encontró estas instrucciones (como yo).

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

Tenga cuidado con los espacios, especialmente cerca de \(y \).

Por cierto, lo usé para apachetop, para encontrar los sitios web más activos en mi servidor.

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)
Kristjan Adojaan
fuente
2

no necesita especificar dir1 a dir4 por nombre si está utilizando regextype

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: buscar archivos, no directorios
  • regextype sed: utiliza sed regextype
  • regex: busca utilizando expresiones regulares en toda la ruta
  • ".*/dir[1-4]/[a-z0-9]*":. * al principio significa cualquier número de caracteres que podrían ser de tipo (char / number / backslash (/), etc.); dir [1-4] significa buscar "dir" seguido de un número entre 1 y 4; / [^ /] * indica que después de dir1-4 omite cualquier nombre de ruta que tenga / en ellos, por lo que solo devuelve archivos en el directorio dir1-dir4 e ignora cualquier subdirectorio que pueda estar dentro de dir1-dir4.

creó un directorio para que lo pruebe: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017

alpha_989
fuente
(1) Es posible que nunca sepamos la situación o los requisitos exactos de Aaron, pero otras respuestas han tomado la decisión prudente de que tiene cuatro directorios, cuyos nombres no están especificados. (Podrían ser red, green, bluey yellow, o podrían ser John, Paul, Georgey Ringo.) Su respuesta supone que son , literalmente dir1 , dir2, dir3y dir4. … (Continúa)
Scott, el
(Continúa) ... (2) ¿Por qué supone que Aaron no quiere buscar subdirectorios? Parece estar diciendo que lo hace. (3) ¿Por qué restringe la búsqueda a archivos cuyos nombres contienen solo letras minúsculas y dígitos (excluyendo cosas como foo_bar, foo.txty FOO)? (4) ¿Por qué su texto explica /[^/]*cuando su respuesta no lo usa?
Scott
Hola Scott, ese es tu comentario.
alpha_989
(1-3). menciona "Estoy tratando de enumerar todos los archivos de dir1, dir2, dir3 y dir4 " que podrían estar en cualquier lugar como un subdirectorio de mi cwd , lo que significa que dir1-dir4 podría estar en cualquier lugar, pero él quiere encontrar el archivo correcto dentro de dir1-dir4. por supuesto, si no es dir1-dir4, debe cambiarlo a los nombres específicos usando rojo \ | azul \ | verde \ | etc ..
alpha_989
4. error tipográfico allí ... Utilicé [a-z0-9] * antes ... luego me di cuenta de que [^ /] * es más corto y más inclusivo ... olvidé cambiarlo cuando publiqué esto. Gracias por sus cuidadosos comentarios.
alpha_989
0

Sé que especificaste que usando find, pero solo para mostrar otras opciones que se pueden usar, puedes usar xargs:

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

Puede tener un archivo llamado "carpetas" que contenga algo como:

$ cat folders
dir1
dir2
dir3
dir4

Entonces, puedes hacer algo como esto:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

xargs en mi opinión, me siento más versátil que find -exec. También puedes hacer cosas locas como

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

/home/user/Documents/dir3:
file1  file2  file3  file4
Cuauhtli
fuente