Eu tenho esse script
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Funciona, exatamente isso, para um arquivo chamado 001.png
, ele cria em 001.png.txt
vez de 001.txt
.
Como posso modificar isso?
for filePng in "$folder"/*
etouch "$filePng".txt
- observe que apenas as cita quando precedido por a$
.Respostas:
Você pode usar o
basename
comando aqui:Observe o adicional
$folder/
. Isso é necessário, pois o comando basename remove o caminho.fonte
$filePng
- elas também foram úteis.$( )
estabelece um novo contexto de cotação.Você pode remover a extensão existente usando os recursos de expansão de parâmetro do shell
Portanto, no seu caso, substitua
$filePng.txt
por"${filePng%.png}.txt"
fonte
Com a variação do que a chave de aço já mencionou - expansão de parâmetros -, podemos usar a substituição de cordas para fazer o trabalho. Além disso, você deve citar variáveis. Abaixo está o seu script editado.
fonte
Se você tiver muitos arquivos para criar, vale a pena "tocar" mais de um arquivo por vez, para que você não precise bifurcar um novo processo para cada um deles (o que leva algum tempo se for realizado vários mil vezes).
Opção 1: substituição de padrão +
xargs
Essa opção fornecerá vários caminhos para o
touch
comando de uma só vez, geralmente alguns milhares ou o que o sistema puder caber em uma única linha de comando.Opção 2: expansão de parâmetro + redirecionamento de saída de comando
Essa opção não é executada
touch
, mas usa os recursos de shell Bash / Bourne / POSIX, que não exigem subprocessos.fonte
Se você tem certeza de que não possui arquivos em
.png
algum lugar no meio do nome, basta usar uma matriz com a expansão de parâmetros:Isso armazena todos os caminhos para os arquivos que terminam em
.png
uma matriz e, em seguida, usa a expansão de parâmetros para criar a lista de.txt
arquivos, substituindo.png
por.txt
cada um.Lembre-se de que isso será interrompido se você tiver tantos arquivos que eles não poderão ser transmitidos como argumentos para a mesma chamada de
touch
.fonte