encontra arquivos correspondentes em um diretório e subdiretórios

1

Eu usei o Percona XtraBackup para criar um backup compactado, mas agora preciso descompactar os arquivos. As instruções dizem que devo correr:

for bf in 'find . -iname "*\.qp"'; do qpress -d $bf $(dirname $bf) && rm $bf; done

mas parece que vai procurar em todo o lado e descomprimir todos os ficheiros que encontrar. Eu só quero que apenas descomprima os arquivos em um diretório específico e seus subdiretórios.

Eu tentei executar:

for bf in 'find . -iname "/path/to/my/directory/*.qp"'; do qpress -d $bf $(dirname $bf) && rm $bf; done

Mas isso deu o erro:

find: warning: Unix filenames usually don't contain slashes (though pathnames do).  
That means that '-iname '/path/to/my/directory/*.qp'' will probably evaluate to false all the time on this system.  

Como posso fazer isso?

    
por IGGt 07.11.2016 / 15:56

2 respostas

1

O erro informa onde está o erro. Nenhum nome de arquivo terminando com /directory/*.qp existe. O parâmetro -iname é sobre o nome de arquivo correto, não o caminho.

Portanto, você deve preceder o comando com cd /path/to/my/directory/ ou escrever o comando find como find /path/to/my/directory/ -iname "*.qp" , que é o que você deseja: a partir desse diretório, marque todo o nome de arquivo correspondente ao *.qp .

    
por 07.11.2016 / 16:15
2
for bf in 'find . -iname "*\.qp"'; do qpress -d $bf $(dirname $bf) && rm $bf; done

for bf in 'find . -iname "/path/to/my/directory/*.qp"'; do qpress -d $bf $(dirname $bf) && rm $bf; done

Ambos os comandos têm vários problemas. Obviamente, eles não conseguem lidar com nomes de arquivos incomuns, tanto por meio de looping na saída de find quanto por não citar variáveis.

Então, é claro, há o fato de que um nome de arquivo nunca conterá uma barra, como observado no erro que você recebeu.

O que você quer é:

find /path/to/my/directory -type f -iname '*.qp' -exec sh -c 'for f in "$@"; do qpress -d "$f" "$(dirname "$f")" && rm "$f"; done' find-sh {} +

Ou uma versão alternativa com quebras de linha:

find /path/to/my/directory -type f -iname '*.qp' -exec sh -c '
  for f
  do
    qpress -d "$f" "${f%/*}" &&
      rm "$f"
  done' find-sh {} +

Leitura adicional:

por 08.11.2016 / 01:58

Tags