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 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
:
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.
$PWD
vez de executar o comando.
Use basename
:
echo $(basename /foo/bar/stuff)
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 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;
ls
inclui 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, echo
pode falhar se qualquer nome de arquivo for hífen + letra ou contiver barra invertida. O OTOH ls -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.