Sempre cite suas substituições. Não adicione citações falsas às suas strings.
foo="${file#...}"
bar="${file%...}"
baz="$file"
este é um tópico de três partes para um processo de duas partes que ainda não está funcionando para mim:
Objetivo: manipular um nome de arquivo e excluí-lo o nome do arquivo tem espaços entre as palavras e depois o ponto .ext
Solução: 1) remova todo o espaço em branco entre as palavras que estão sendo feitas em uma longa seqüência de caracteres, sem espaço em branco entre eles e, em seguida, exclua esse arquivo.
ou 2) coloque aspas em ambos os lados do nome do arquivo com espaços e exclua esse arquivo.
o que fiz para obter minha solução. usando três maneiras diferentes de alcançar minha solução para a primeira parte do meu objetivo, ainda não atingindo minha solução para a segunda parte do meu objetivo.
primeiro como obtive meu nome de arquivo de um diretório em uma variável.
find $PWD -name "*.mp3" | while [ $xf -le $MAXNUM ] ;
do read FILENAME;
a variável $ FILENAME retornou o caminho / nome de arquivo completo
'/ home / userx / ffmpegdir / sub / ficheiro com - muitos espaços e __ ----- _ & * * # $$ LSD --- -em nome _ (3) .mp3 '
Eu usei o basename para remover o nome de arquivo dessa string para fornecer apenas o nome do arquivo usando apenas as variáveis pref e ext.
# retire o antigo nome do arquivo do caminho de FILENAME
c=$FILENAME
xpath=${c%/*}
xbase=${c##*/}
xfext=${xbase##*.}
xpref=${xbase%.*}
path=${xpath}
pref=${xpref}
ext=${xfext}
então eu atribuo a outra variável.
#puts quote marks on both sides of the file
#with spaces adding the dot (.)
# extention "mp3" giving me a new file name
#with the same ext.
differentquotes="${pref}.${ext}"
retorna este, o novo arquivo com ext. ainda tendo espaços e tal entre as palavras
quando eu chamo rm para remover o arquivo eu adiciono aspas em torno desse nome de arquivo como este
rm "\"${differentquotes}\""
que chama o rm assim com as aspas nos dois extremos do arquivo
então tudo que recebo é um erro de retorno como este
rm: não é possível remover o arquivo "" com muitos espaços e __ ----- _ & & ### $$ LSD ---- no nome _ (3) .mp3 "': Nenhum arquivo ou diretório desse tipo
então eu decidi tentar remover todos os espaços entre o nome do arquivo e tentei excluí-lo assim
oldname="${pref// }.${ext}"
echo "${oldname}" "the hole name now is that "
echo
echo "calling rm" "${oldname}\"\""
rm "${oldname}"
e obtive esse resultado, ele removeu todos os espaços entre o nome do arquivo, mas ainda recebi um erro de retorno do rm.
oldname = 'filewith - lotsofspacesand_ ----- & & * # # LSD ---- inthename_ ( 3) .mp3 '
rm 'filewith - lotsofspacesand_ ----- & & ### $$ LSD ---- inthename_ (3 ) .mp3 ' rm: não é possível remover 'filewith - lotsofspacesand_ ----- & & #; # # $$ LSD ---- inthename_ (3) .mp3 ': Nenhum arquivo ou diretório desse tipo
então eu tentei assim. Eu removi todo o espaço dentro de apenas o pref var primeiro, atribuindo-o a outro nome var, em seguida, coloque o ext nele, então tentei removê-lo e consegui isso com o mesmo erro
anothernewname="${pref// }"
echo ${anothernewname}
putthemtogether="${anothernewname}.${ext}"
echo ${putthemtogether}
rm "${putthemtogether}"
Eu removi todos os espaços entre as palavras apenas no pref: + anothernewname = 'filewith - lotsofspacesand_ ----- & & #; # # $$ LSD ---- inthename_ (3)'
então eu coloco o ext de volta no nome da variável diferente aqui:
então eu chamei rm para removê-lo e ainda recebi o mesmo erro:
rm: não é possível remover 'filewith - lotsofspacesand_ ----- & & * * # $$ LSD ---- inthename_ (3 ) .mp3 ': Nenhum arquivo ou diretório + echo
todas as três vezes recebo o mesmo erro - Nenhum arquivo ou diretório desse tipo
qual é a resposta para "o que estou fazendo de errado para que eu não faça mais isso?"
adicionou isto: Eu apenas tentei isso: adicionando o caminho vatiable para dizer onde é o caminho / nome de arquivo
rm "${path}"/"\"${differentquotes}\""
dando-me ainda um erro:
rm: cannot remove '/home/userx/ffmpegdir/sub/"file with -- lots of spaces and ____ ----- ___ &&???*# $$ LSD ----in the name _(3).mp3"': No such file or directory
se eu colocar isso no terminal, é como se ele funcionasse: rm path / "nome do arquivo com spaces.ext" assim como é lido acima - isso não é um sim também?
Sempre cite suas substituições. Não adicione citações falsas às suas strings.
foo="${file#...}"
bar="${file%...}"
baz="$file"
Sua pergunta é extremamente longa e difícil de seguir. Aqui estão alguns erros que eu peguei, pode haver outros.
do read FILENAME;
Isso remove os espaços em branco no início e no final da linha e executa a expansão da barra invertida (para que todas as barras invertidas sejam removidas, exceto após outra barra invertida). Para processar uma linha literalmente, use
do IFS= read -r FILENAME
O problema real que você está enfrentando é provavelmente este:
rm "\"${differentquotes}\""
Você está adicionando o caractere "
antes do nome do arquivo e o caractere "
após o nome do arquivo. Você está dizendo rm
para excluir um arquivo cujo nome começa e termina com um caractere "
. Você provavelmente quis excluir o arquivo cujo nome é o valor da variável differentquotes
(cujo nome não reflete seu valor). Para excluir o arquivo cujo nome é o valor da variável differentquotes
, use
rm -- "$differentquotes"
(O --
é para o caso de o argumento começar com -
; não é necessário com o código mostrado aqui, pois find
sempre imprime nomes que não começam com -
e se eu leia sua transformação corretamente, não corre o risco de apresentar uma.)
A regra principal para lidar corretamente com nomes de arquivos com espaços em branco e outros caracteres especiais é sempre colocar aspas duplas em torno das substituições de variáveis e comandos . Isso é "$foo"
- as aspas fazem parte da sintaxe do shell. Se você tem \"
em algum lugar, isso torna a parte do caractere "
de uma string em vez de parte da sintaxe da shell.
Depois disso, parece que você tentou remover espaços e inseri-los novamente. Você cometeu o mesmo erro de adicionar caracteres de aspas espúrios dentro do que você usa como o nome do arquivo. Além disso, você não pode colocar de volta espaços que você removeu - você não saberia quantos espaços para colocar de volta ou onde.
Isso deve ser feito. Observe as aspas duplas em torno das variáveis que representam os nomes de arquivos com espaços. Certifique-se de substituir o .mp3 pela extensão desejada.
#!/bin/bash
LOCATION="/path/to/file"
for FILE in $LOCATION/*; do
if [[ $FILE == *.mp3 ]]; then
NEWNAME='echo $FILE | tr '\ ' _'
echo "File name was ${FILE}. File name without spaces is $NEWNAME"
#uncomment this next line to move the file to the new name without spaces
mv "$FILE" $NEWNAME
#uncomment this next line if you want to instead remove the file
#rm "$FILE"
fi
done
Os passos que tomei estão nos comentários abaixo:
# rename old file regardless of how messes up or not
# it is using basename to get information needed
killfile="${pref}.${ext}"
# copy old file name to a different file name
# using the mv command
# mv ${old file name.ext} ${oldfile name//search pattern/replace with]
# gives you a new file with what ever you named it
mv "$killfile" "${killfile//*/killme.k}"
#the then just delete it
rm "killme.k"
Ao fazê-lo desta maneira, descobri que o sistema o verá, portanto, eliminou o meu arquivo sem obter o no such file or directory error
- que estava obtendo.