script bash não compara nomes de arquivos com [e] corretamente

1

Eu tenho um script bash que lida com arquivos. Ele find s todos os arquivos em um diretório e procura o nome de cada um em outro diretório. Para isso usa

"${myfiletobesearched}"

dentro do script. No entanto, se o nome do arquivo contiver [ou], o script não o encontrará no segundo diretório, mesmo se uma cópia do arquivo também estiver lá. O que posso fazer para que os nomes dos arquivos sejam reconhecidos como iguais?

Consegui reduzir o problema a um exemplo.

myfile="My File [Official Awesome File].txt"
find ./ -name "${myfile}" -type f

fornece qualquer saída, mesmo se houver um arquivo com esse nome. Escrever \[ ou algo assim é claro não é uma opção , porque myfile vem inspecionando um diretório.

Aqui está o script: link

    
por Make42 01.05.2016 / 17:29

2 respostas

1
myfile="My File [Official Awesome File].txt"
myfile=$(echo $myfile | sed -r 's/(\[|\])/\/g')    
find ./ -name "${myfile}" -type f

você pode verificar se isso funciona?

Espero que isso altere o valor de myfile para

myfile="My File \[Official Awesome File\].txt"

Melhor seria usar printf :

myfile=$(printf '%q\n' "$myfile")

No seu exemplo específico em find , isso seria:

find ./ -name "$(printf '%q
myfile="My File [Official Awesome File].txt"
myfile=$(echo $myfile | sed -r 's/(\[|\])/\/g')    
find ./ -name "${myfile}" -type f
' "$myfile")" -type f
    
por 01.05.2016 / 18:40
0

O argumento para o parâmetro -name do find é um glob pattern , não um nome do arquivo , e colchetes são metacaracteres do padrão glob.

Descobri que uma maneira de contornar isso é usar um script perl em linha que usa uma correspondência de string exata em vez de um padrão:

myfile="My File [Official Awesome File].txt"
perl -MFile::Find -le 'find( sub {
  return unless $_ eq $ARGV[0];
  print $File::Find::name;
}, $ARGV[1] )' "${myFile}" .
    
por 07.08.2018 / 01:50