Comando ls | grep muestra solo directorios (cuando también debería mostrar archivos)

Comando ls | grep muestra solo directorios (cuando también debería mostrar archivos)

En Linux, tengo archivos que contienen, entre otros, muchos archivos y directorios que contienen el "desecho" literal. Puedo verlos escribiendo ls *scrap*sin problema. Sin embargo, eso también devuelve directorios que contienen el "desecho" literal y me gustaría excluirlos.

Intenté jugar con ls | grep ".*scrap.*"o ls | grep scrappero esto devuelve sólo los directorios (no los archivos normales).

¿Por qué esto es tan?

El siguiente paso será (una vez que el representante devuelva el resultado correcto) eliminar los directorios de ese resultado. ¡Las sugerencias sobre cómo hacerlo también son bienvenidas!

Respuesta1

En realidad, para eventualmente enumerar todos los archivos normales en el directorio actual (en el primer nivel) que tienen scrapsus nombres, no necesita ls+ grep.

Con el viejo bienfinddominio:

find . -maxdepth 1 -type f -name "*scrap*" -ls

Respuesta2

Te encuentras con problemas lscuando greplos nombres de archivos contienen espacios o (peor) nuevas líneas. Pero con nombres de archivos seguros puedes hacer esto:

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

Pero normalmente deberías utilizar el findenfoque.

Respuesta3

Para los nombres de los archivos que no son de directorio en el directorio actual que contienen scrap, en zsh:

print -rC1 -- *scrap*(ND^/)

Tenga en cuenta que en ls *scrap*(o más correcto ls -- *scrap*), si alguno de los *scrap*archivos es del tipodirectorio, luego lsenumerará suscontenido(con un that-scrap-dir:encabezado a menos que *scrap*se expanda a un solo archivo que sea ese directorio).

Si quieres eso para archivos de tipodirectorio, lssimplemente imprime su nombre como para otros tipos de archivos, necesitarías agregar la -dopción:

ls -d -- *scap*(D^/)

Pero casi no tiene sentido usarlo, lsya que todo el trabajo de buscar archivos por nombre y tipo lo ha realizado el shell en el momento en que lsse invoca, también puede usar el incorporado printo printfde su shell.

Respuesta4

Pareceestees la respuesta que estás buscando. La publicación habla de que la expansión global es la razón por la que solo se muestran ciertas cosas.

información relacionada