Eu tenho um diretório que tem vários subdiretórios nele. Estou percorrendo os subdiretórios um por um. Então eu mudo o diretório usando cd. Se nesse subdiretório eu tiver um arquivo com extensão .partial, salve o nome do arquivo. Então eu preciso imprimir o nome do subdiretório e o nome do arquivo parcial. eu escrevi algo assim
for f in *
do
if [ -d "$f" ]; then
cd "$f"
a=$(find ./ -name "*.partial")
if [ -e "$a" ];then
echo -e "$f" "\t" "$a"
fi
cd ..
fi
done
O problema find
é que ele procura recursivamente por .partial
extensões de arquivo em outros subdiretórios, o que eu não quero. Como posso restringi-lo apenas ao diretório atual?
Para apenas gerar o nome do caminho completo para cada
.partial
arquivo em relação ao diretório atual:Definir a
nullglob
opção shell embash
faria com que isso não produzisse o próprio padrão se não houver correspondência (ainda haveria uma linha vazia de saÃda), e a configuraçãodotglob
também corresponderia a nomes ocultos.O seguinte divide esses nomes de caminho em um caminho de diretório e uma parte de nome de arquivo:
Isso imprimiria o nome do subdiretório e o nome do
.partial
arquivo para cada.partial
nome encontrado em qualquer subdiretório do diretório atual.Em
bash
, você também pode definir a opção de shelldotglob
se precisar corresponder também a nomes ocultos.As duas substituições de parâmetro podem ser substituÃdas por chamadas para
dirname
ebasename
:Uma variação do acima para imprimir o nome do subdiretório apenas uma vez (isso requer um
bash
shell -like para a${*%%*/}
expansão do parâmetro que remove os caminhos do diretório e deixa os nomes dos arquivos, para cada parâmetro posicional):Isso faz um loop em cada subdiretório e expande o
*.partial
padrão globbing em cada um. Se a primeira correspondência for um arquivo regular (ou um link para um), o nome do subdiretório será impresso seguido pelos nomes que corresponderam ao padrão, com o caminho do diretório removido.O
find
utilitário suporta a opção-maxdepth
Para restringir
find
ao diretório especificado, você pode adicionar a opção-maxdepth 1
.Se você estiver tentando listar todos os arquivos regulares
*.partial
na profundidade 2 com uma saÃda semelhante à da sua pergunta, tente um comando comoque poderia dar uma saÃda semelhante a
Se você tem GNU
find
você pode fazer algo assimSe você não tem GNU
find
você pode emular o-printf '%f\n'
às custas de alguma eficiência, como esteNenhuma das soluções lida com arquivos com novas linhas ou caracteres de impressão estranhos, mas se você estiver listando arquivos em um diretório em uma única linha, esperaria que você não tivesse nomes de arquivos estranhos. Se você tem um shell que não entende
[[ ... ]]
, basta substituir os colchetes duplos por colchetes simples,[ ... ]
.