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 ":"
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.
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 ":"
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
O seguinte comando faz:
for d in 'find / -maxdepth 1 -mindepth 1 -type d'; do find $d -maxdepth 1 -type f | head -n1 ;done
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). 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.
Tags command-line bash ms-dos linux shell