bash: adicionando uma string comum aos arquivos encontrados com curingas

0

Eu estou querendo saber se existe uma maneira de renomear uma ampla gama de arquivos que são encontrados usando padrões de curinga. Por exemplo, digamos que eu queira scp de todos os arquivos que correspondem a um determinado padrão, mas acrescente uma string aos nomes dos arquivos em um determinado ponto. Algo parecido com isto:

REMOTE:

hello.txt
help.txt
heroes.txt

QUERO LOCALMENTE:

hello_copy.txt
help_copy.txt
heroes_copy.txt

Obviamente, scp user@remote_host:~/he*.txt ./he*_copy.txt não funciona. Eu estou querendo saber se isso é possível, ou se eu preciso copiar todos os arquivos individualmente.

O ideal é que eu esteja procurando uma solução que funcione durante todo o bash, para que eu possa fazer a mesma coisa com mv , cp , etc.

    
por ewok 17.02.2015 / 21:11

1 resposta

3

Infelizmente, os curingas são bastante limitados. Mas isso pode ser feito com alguns comandos extras. Primeiro, você pode percorrer os arquivos com for :

bash$ ls -1
hello.txt
help.txt
heroes.txt
bash$ for f in *; do echo "$f"; done
hello.txt
help.txt
heroes.txt

Você também pode fazer uma filtragem inicial usando *.txt em vez de apenas * . Certifique-se de citar a variável para evitar que espaços ou caracteres especiais em nomes de arquivos quebrem o comando.

Agora você pode substituir uma string por outra com sed (a barra invertida é necessária porque o ponto tem um significado especial sem ela , e o cifrão depois significa "fim da string"):

bash$ for f in *; do echo "$f" | sed s/\.txt$/_copy.txt/; done
hello_copy.txt
help_copy.txt
heroes_copy.txt

Você pode facilmente transformar isso em um comando . Por exemplo, um mv (vamos ver primeiro como é possível obter um echo extra):

bash$ for f in *; do echo mv "$f" 'echo "$f" | sed s/\.txt$/_copy.txt/'; done
mv hello.txt hello_copy.txt
mv help.txt help_copy.txt
mv heroes.txt heroes_copy.txt

Tudo parece bom, então vamos fazer isso de verdade agora:

bash$ for f in *; do mv "$f" 'echo "$f" | sed s/\.txt$/_copy.txt/'; done
bash$ ls -1
hello_copy.txt
help_copy.txt
heroes_copy.txt

Você pode até mesmo desfazer a renomeação usando sed s/_copy\.txt$/.txt/ : -)

    
por 17.02.2015 / 22:20