listando arquivos em um diretório sem listar subdiretórios e seu conteúdo nesse diretório

24

Desejo criar uma lista de todos os arquivos em um diretório, sem listar nenhum dos subdiretórios que residem no mesmo diretório e imprimir essa lista em um novo arquivo.

ls -d * > filelist

criará uma lista de todos os arquivos no diretório atual, mas também listará os subdiretórios no diretório atual. Eu tentei o findcomando usando a -maxdepth 1opção - no entanto, o formato de saída é um problema, pois o find também imprime o caminho junto com os nomes dos arquivos.

Se alguém puder me dizer, talvez, outro comando ou opções a serem utilizados que produzam uma lista de saída apenas dos arquivos em um diretório e não dos nomes dos subdiretórios ou de seu conteúdo, eu agradeceria.

janet
fonte
2
Estou confuso ls -d *apenas liste os arquivos e pastas na pasta atual, excluindo arquivos / pastas ocultos aqui;
GM-Script-Writer-62850 /
Sim, mas eu não quero que as pastas em que diretório coletados, só deseja os arquivos no diretório coletados
janet

Respostas:

22

Solução baseada em localização:

find . -maxdepth 1 -type f -printf '%f\n'

Solução baseada em bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

A solução baseada em bash oferece a você tudo o que não é um diretório; incluirá coisas como pipes nomeados (você provavelmente deseja isso). Se você deseja especificamente apenas arquivos , use o findcomando ou um destes:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Se você vai usar isso regularmente, é claro que pode colocar isso em um alias em algum lugar do seu ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Como você observou nos comentários que está realmente no OSX, e não no Ubuntu, sugiro que da próxima vez você encaminhe perguntas para os sites Apple ou mais gerais do Unix e Linux Stack Exchange.

evilsoup
fonte
1
Verifique se essas soluções estão corretas para você, com base em se você deseja ou não incluir arquivos ocultos.
Kevin Wheeler
10

Listar apenas nomes de arquivos:

1. ls -p | grep -v / (sem arquivos ocultos)
 2. ls -l | grep ^ - | tr-s '' | cut -d '' -f 9 (sem arquivos ocultos)

 a) ls -pa | grep -v / (com arquivos ocultos)
 b) ls-la | grep ^ - | tr-s '' | cut -d '' -f (com arquivos ocultos)

Listar apenas diretórios:

1. ls -p | grep / (sem oculto)
 2. ls -l | grep ^ d | tr-s '' | cut -d '' -f 9 (sem oculto)

 a) ls -pa | grep / (com oculto)
 b) ls -l | grep ^ d | tr-s '' | cut -d '' -f 9 (com oculto)

grep -v -e ^ $ é remover linhas em branco do resultado.

Mais detalhes :
ls -p flag é colocar '/' no final do nome do diretório, -R flag é para pesquisa recursiva, -l para listar com informações, -a para listar todos (incluindo arquivos ocultos) com informações, grep -v flag é para inversão de resultado e -e flag para correspondência de expressões regulares.

Ananda
fonte
7

Para listar apenas arquivos regulares:

ls -al | grep ^-

Com links simbólicos incluídos:

ls -al | grep ^[-l]

Onde o primeiro caractere da lista descreve o tipo de arquivo, -significa que é um arquivo comum, pois o link simbólico é l.

Debian / Ubuntu

Imprima os nomes de todos os arquivos correspondentes (incluindo links):

run-parts --list --regex . .

Com caminhos absolutos:

run-parts --list --regex . $PWD

Imprima os nomes de todos os arquivos /etcque começam com pe terminam com d:

run-parts --list --regex '^p.*d$' /etc
kenorb
fonte
5

Mais uma solução, uma ingenuamente curta que funcionou para mim:

ls -la | grep -E '^[^d]' > files
arsaKasra
fonte
perfeito para mim,ls -alR |grep -E '^-'
aqui
4

Eu sugeriria usar find e apenas remover o nome do diretório da saída, se necessário:

find . -type f -maxdepth 1 | sed s,^./,,
Puma
fonte
2
-maxdepth 1deve vir antes de qualquer filtro, e você pode obter esse resultado sem usar sedcom a -printfopção, ou seja: find . -maxdepth 1 -type f -printf '%f\n'(isso será mais eficiente do que usar um programa extra).
evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Outra opção possível é

ls -F | grep -v '/' | sed /[@*]$// > filelist

Os --file-typecoloca um / no final das pastas (mas também um @ no final de links simbólicos. The grep -v '/'Remove os subdiretórios (porque agora terminar com um '/'). As sed s/@$//remove essa @. Os -1 imprime um arquivo por linha para que o grep -v funcione corretamente.

Dr.Tower
fonte
obrigado pela sua resposta. infelizmente, não está funcionando para mim, talvez eu esteja executando incorretamente. se eu usar o comando exato que você me forneceu, eu recebo o seguinte erro: ls: opção ilegal - - uso: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [arquivo ...] tentei usar o caractere curinga * no lugar e também no em conjunto com --file-type. se você pudesse esclarecer eu agradeceria!
Janet
O comando funciona para mim (executando 13.04), qual versão do ubuntu você está usando ?; -1não importa grep você não precisa; se você quiser incluir arquivos ocultos, use a -aopção emls
GM-Script-Writer-62850
na verdade, eu estou trabalhando em um mac. talvez o comando seja um pouco diferente no mac os x ou unix?
janet 02/02
1
Você também pode tentarls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower