Como excluo arquivos com espaços neles no script bash?

1

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

  • differentquotes = 'arquivo com - muitos espaços e __ ----- _ & & #; # # $$ LSD ---- no nome _ (3 ) .mp3 '

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

  • rm '"arquivo com - muitos espaços e __ ----- _ & & #; # # $$ LSD ---- no nome _ (3 ) .mp3 "'

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:

  • putthemtogether = 'filewith - lotsofspacesand_ ----- & * # # $$ LSD ---- inthename_ (3). mp3 '

então eu chamei rm para removê-lo e ainda recebi o mesmo erro:

  • rm 'filewith - lotsofspacesand_ ----- & & #; # # $$ LSD ---- inthename_ (3) .mp3 '

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?

    
por uxserx-bw 07.12.2013 / 17:25

4 respostas

1

Sempre cite suas substituições. Não adicione citações falsas às suas strings.

foo="${file#...}"
bar="${file%...}"
baz="$file"
    
por 07.12.2013 / 18:30
1

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.

    
por 09.12.2013 / 01:20
0

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
    
por 07.12.2013 / 21:24
0

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.

    
por 07.12.2013 / 21:23