substitui arquivos na linha de comando por uma string específica

1

Eu preciso procurar (em todo o disco) e substituir (onde existem correspondências) um arquivo com outro (ambos no mesmo caminho).

Exemplo:

  Folder 1
    x*.txt (good) (e.g.: xFile.txt)
    *.txt (bad) (e.g.: File.txt)

Se houver uma correspondência de ambos os arquivos no mesmo caminho, preciso excluir: *.txt (e.g.: File.txt) e renomear: x*.txt (e.g.: xFile.txt) to *.txt (e.g.: File.txt)

Resultado:

 Folder 1
  *.txt (e.g: File.txt... old xFile.txt)

Eu uso este comando:

find -name 'x*.txt' | sed -r 'p;s/g([^\/]*.txt)//' | xargs -d '\n' -n2 mv

O problema é que o comando não verifica se ambos os arquivos existem (xFile.txt e File.txt no mesmo caminho) antes de executar a ordem

Como posso resolver isso? Agradecemos antecipadamente

    
por ajcg 13.06.2018 / 19:17

2 respostas

3

Com as ferramentas do GNU, você pode fazer algo como:

(export LC_ALL=C
  find . -name '*.txt' -print0 |
  sed -Ez 's|/x([^/]*)$|/|' |
  sort -z |
  uniq -zd |
  sed -z 'h;s|.*/|&x|;G' |
  xargs -r0n2 echo mv)

Isso pressupõe que não haja arquivos cujo nome comece com mais de um x . Por exemplo, não fará mv ./xx.txt ./x.txt

    
por 13.06.2018 / 23:05
0

Primeiro, definimos uma função para fazer o trabalho para nós:

switcheroo() {
    [[ -f x"$1" ]] && mv -f x"$1" "$1"
}
export -f switcheroo

Agora, usamos find e um pouco de magia negra para iterar sobre nossos filhotes:

find . -name \*.txt -execdir bash -c 'switcheroo "$0"' "{}" \;

Usamos find para localizar todos os arquivos com uma extensão .txt (isso pode ser refinado para atender aos critérios que você preferir) e, por sua vez, executá-los pelo processo switcheroo - usamos [[ ... ]] para testar o existência do arquivo de substituição, e se estiver presente, use mv para efetuar a substituição.

    
por 13.06.2018 / 21:43