Não é seguro analisar ls
ou canalizar find
[ 1 , 2 ]
Não é seguro analisar (e canalizar) a saída ls
ou find
, principalmente porque é possível encontrar nos nomes dos arquivos caracteres não usuais como a nova linha , a guia ... Aqui um ciclo de shell puro funcionará [ cuonglm ] .
Mesmo o find
comando não canalizado com a opção -exec
funcionará:
find ./*.png -exec basename {} .png \;
Atualizações / Notas : Você pode find .
pesquisar até os arquivos ocultos ou find ./*.png
obter apenas os não ocultos. Com find *.png -exec ...
você pode ter problema no caso de estar presente um arquivo nomeado .png
porque o find irá obtê-lo como uma opção. Você pode adicionar -maxdepth 0
para evitar a descida nos diretórios nomeados como Dir_01.png
, ou find ./*.png -prune -exec ...
quando maxdepth não for permitido (obrigado Stéphane). Se você deseja evitar listar esses diretórios, adicione a opção -type f
(que também excluiria outros tipos de arquivos não regulares). Dê uma olhada no man
panorama mais completo sobre todas as opções disponíveis e lembre-se de verificar quando são compatíveis com POSIX, para uma melhor portabilidade.
Algumas palavras mais
Pode acontecer, por exemplo, que, copiando o título de um documento e colando no nome do arquivo, uma ou mais novas linhas sejam finalizadas no próprio nome do arquivo. Podemos ser tão azarados que um título possa conter até a chave que precisamos usar antes de uma nova linha:
The new art of working on .png
files and other formats.
Se você deseja testar, pode criar nomes de arquivos como este com os comandos
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
O simples /bin/ls *png
será exibido em ?
vez dos caracteres não imprimíveis
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
Em todos os casos em que você canalizará a saída de ls
ou find
o seguinte comando terá nenhum indício de entender se a atual linha vem de um novo nome do arquivo ou se segue uma nova linha de caracteres no precedente nome do arquivo . Um nome desagradável , de fato, mas ainda legal.
Um ciclo de shell com um parâmetro Parameter-Expansion,, ${parameter%word}
na variante com printf
ou echo
irá funcionar ,, [ cuonglm ], [ Anthon1 ] .
for f in *.png; do printf "%s\n" "${f%.png}" ; done
Na página de manual da expansão de parâmetros do shell [ 3 ]
$ {parameter% word}
$ {parameter %% word}
... o resultado da expansão é o valor do parâmetro com o padrão de correspondência mais curto (o caso '%') ou o padrão de correspondência mais longo (o caso '%%') excluído.
.
neles. Embora a convenção diz para nomear seus arquivos com.png
, no final, não há nenhuma razão para que eu não posso ter um arquivo PNG chamadofoo.zip
oumy.picture.20160518
ou apenasmypic
.