Como listar um arquivo em cada subdiretório da pasta raiz?

5

Desculpas se isso é trivial, mas como listar apenas um arquivo em cada subdiretório da minha pasta raiz? O terminal Linux ou a sintaxe do MS DOS não importam. Eu acho que seria um comando ls ou dir com algum parâmetro, mas eu não encontrei nada no manual para qualquer comando.

    
por Chad 27.09.2011 / 04:44

4 respostas

2

Se você quiser ver os nomes dos diretórios use -

ls -R1 | grep -A 1 ":"

Se você NÃO quiser ver os nomes dos diretórios, use -

ls -R1 | grep -A 1 ":" | grep -v ":"

    
por 27.09.2011 / 05:10
0

Escrevi um pequeno script para fazer isso.

#!/bin/bash
for dir in 'find . -type d' # Find directories recursively
do
  # cd into directory, quotes are for directory names with spaces
  cd "$dir"             

  # Print out directory name
  echo "In directory $dir:"

  # Force list output to be one entry per line, pipe through inverted grep to 
  # exclude directories, pipe through awk to get the first item. You can specify
  # the number of files you want.     
  ls -p1 | grep -v / | awk -v "num_of_files=1" 'NR<=num_of_files { print $1 }'

  # cd back to root directory
  cd "$OLDPWD"              
done

Saída:

In directory .:
test.sh
In directory ./bar:
barfile.txt
In directory ./baz:
bazfile.txt
In directory ./baz/quux:
something.txt
In directory ./foo:
foofile.txt
    
por 27.09.2011 / 05:04
0

O seguinte comando faz:

for d in 'find / -maxdepth 1 -mindepth 1 -type d'; do find $d -maxdepth 1 -type f | head -n1 ;done
    
por 28.09.2011 / 19:15
0
find -type d -print0 | xargs -0 ls | awk '/^\.\//||newdir{newdir=!newdir;print}'
  • find -type d obtém todos os subdiretórios para o diretório atual.
  • -print0 e -0 cuidam de nomes de arquivos problemáticos (espaços, novas linhas e outros).
  • O comando cryptic awk continuará se o início da linha corresponder a ./ (que denota diretórios) OU se a variável newdir for true . Se continuar, newdir será definido para o seu oposto (ou seja, true se for false e vice-versa) e imprimir a linha.

Alguma elaboração sobre a parte awk : quando um diretório é encontrado, newdir que por padrão é false (já que não está definido) será definido como true e o diretório será impresso. Na próxima linha, ^\.\/ não corresponderá, mas newdir será agora true e o colchete será executado novamente. Agora, newdir será definido como seu oposto ( false ) e a linha será impressa. Agora nenhuma linha será impressa até o próximo diretório aparecer.

Nomes de arquivos com novas linhas incorporadas não serão tratados normalmente por awk neste exemplo.

    
por 01.06.2012 / 09:41