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.
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.
Respostas:
Se você quer uma bashsoluçã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:
echo `basename "$filename"`
As aspas são necessárias caso $ filename contenha, por exemplo, espaços.
$()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.
$PWDvez de executar o comando.
Use basename:
echo $(basename /foo/bar/stuff)
echo? basenamejá imprime os resultados. echopode até destruir o resultado se você não citar o subshell. Exemplo: echo $(basename path/with\ \ spaces)imprime incorretamente with 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:
for filename in $(ls /home/user/)
do
echo $filename
done;
Se você estiver executando o script no mesmo diretório dos arquivos, ele simplesmente se tornará:
for filename in $(ls)
do
echo $filename
done;
lsinclui qualquer arquivo de ponto onde a *expansão geralmente não inclui . Também for 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, echopode falhar se qualquer nome de arquivo for hífen + letra ou contiver barra invertida. O OTOH ls -1 /path/to/dirpor si só imprime de forma confiável cada nome de arquivo em uma linha, modulo a diferença de dotfiles.