Comando ls | grep mostrando apenas diretórios (quando também deveria mostrar arquivos)

Comando ls | grep mostrando apenas diretórios (quando também deveria mostrar arquivos)

No Linux, eu tenho um arquivo que contém, entre outros, muitos arquivos e diretórios contendo o "sucata" literal. Posso vê-los digitando ls *scrap*sem problemas. No entanto, isso retorna também diretórios contendo o "sucata" literal e eu gostaria de excluí-los.

Tentei brincar com ls | grep ".*scrap.*"or ls | grep scrapmas isso retorna apenas os diretórios (não os arquivos normais).

Porque isto é assim?

A próxima etapa será (assim que o representante retornar a saída correta) remover os diretórios dessa saída. Sugestões sobre como fazer isso também são bem-vindas!

Responder1

Na verdade, para eventualmente listar todos os arquivos regulares no diretório atual (no primeiro nível) que possuem scrapseus nomes, você não precisa lsde + grep.

Com o velho e bomfindcomando:

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

Responder2

Você enfrenta problemas lsquando grepos nomes dos arquivos contêm espaços ou (pior) novas linhas. Mas com nomes de arquivos seguros você pode fazer isso:

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

Mas geralmente você deve usar a findabordagem.

Responder3

Para os nomes dos arquivos que não são de diretório no diretório atual que contêm scrap, em zsh:

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

Observe que em ls *scrap*(ou mais correto ls -- *scrap*), se algum dos *scrap*arquivos for do tipodiretório, então lslistará seusconteúdo(com um that-scrap-dir:cabeçalho, a menos que *scrap*expanda em um e apenas um arquivo que seja esse diretório).

Se você quiser isso para arquivos do tipodiretório, lsapenas imprime seu nome como para outros tipos de arquivos, você precisará adicionar a -dopção:

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

Mas não faz sentido usar, lsjá que todo o trabalho de localização de arquivos por nome e tipo foi feito pelo shell no momento em que lsé invocado, você também pode usar o interno printou printfo do seu shell.

Responder4

Parece queesseé a resposta que você está procurando. A postagem fala sobre a expansão global ser a razão pela qual apenas certas coisas estão aparecendo.

informação relacionada