Como faço para repetir apenas o nome do arquivo de um arquivo se iterar um diretório com um loop for?
for filename in /home/user/*
do
echo $filename
done;
irá puxar o caminho completo com o nome do arquivo. Eu só quero o nome do arquivo.
Se você quer uma bash
solução nativa
for file in /home/user/*; do
echo "${file##*/}"
done
O acima usa a expansão de parâmetro que é nativa do shell e não requer uma chamada para um binário externo, comobasename
No entanto, posso sugerir apenas usar find
find /home/user -type f -printf "%f\n"
${file##*/}
para"${file##*/}"
para suportar nomes de arquivos com espaços, por exemplo, "Meu nome de arquivo com espaços.txt".Basta usar
basename
:As aspas são necessárias caso $ filename contenha, por exemplo, espaços.
fonte
$()
como Oli fez/test 1
,basename $(pwd)
saída:test
. Testado em OS X e Ubuntu Server (14.04). A solução bash nativa, conforme recomendado por @SiegeX, é o que funcionou para mim.basename "$(pwd)"
lugar.$PWD
vez de executar o comando.Use
basename
:fonte
echo
?basename
já imprime os resultados.echo
pode até destruir o resultado se você não citar o subshell. Exemplo:echo $(basename path/with\ \ spaces)
imprime incorretamentewith spaces
(apenas um espaço).Outra abordagem é usar
ls
ao ler a lista de arquivos em um diretório para fornecer o que você deseja, ou seja, "apenas o (s) nome (s) do arquivo". Ao contrário de ler o caminho completo do arquivo e, em seguida, extrair o componente "nome do arquivo" no corpo do loop for.Exemplo abaixo que segue seu original:
Se você estiver executando o script no mesmo diretório dos arquivos, ele simplesmente se tornará:
fonte
ls
inclui qualquer arquivo de ponto onde a*
expansão geralmente não inclui . Tambémfor f in $(...) ...
falha se qualquer nome de arquivo contém espaço em branco a menos que você defina IFS, pode falhar se qualquer nome de arquivo contém um caractere glob a menos que você defina -f / -o noglob e, dependendo do sistema ou shell,echo
pode falhar se qualquer nome de arquivo for hífen + letra ou contiver barra invertida. O OTOHls -1 /path/to/dir
por si só imprime de forma confiável cada nome de arquivo em uma linha, modulo a diferença de dotfiles.se você quiser apenas o nome do arquivo:
para obter mais informações sobre o
cut
comando, consulte aqui .fonte