find, xargs e mv: renomeando arquivos com aspas duplas, problema de expansão e precedência de bash

3

Ok, estou simplesmente tentando retirar aspas duplas nos meus nomes de arquivo. Aqui está o comando que eu criei (bash).

$ find . -iname "*\"*" -print0 | xargs -0 -I {} mv {} {} | tr -d \"

O problema é a parte 'mv {} {} | tr -d \"' . Eu acho que é um problema de precedência: o bash parece estar interpretando como (mv {} {}) | tr -d \") , e o que me resta são nomes de arquivos despojados de aspas duplas. Isso não é o que eu quero, obviamente, porque então ele não consegue renomear o arquivo. Em vez disso, quero que o primeiro nome de arquivo tenha aspas, e o segundo não, mais assim: mv {} ({} | tr -d \") .

Como faço isso? Eu tentei colchetes e chaves, mas não tenho certeza do que estou fazendo quando se trata de definir explicitamente a precedência de execução de comandos.

    
por Harv 08.12.2014 / 23:25

3 respostas

5

Supondo que você tenha o comando rename instalado, use:

find . -name '*"*' -exec rename 's/"//g' {} +

O comando rename usa uma expressão Perl para produzir o novo nome. s/"//g realiza uma substituição global do nome, substituindo todas as aspas por uma string vazia.

Para fazer isso com mv você precisa canalizar para um comando shell, assim você pode executar subcomandos:

find . -name '*"*' -exec sh -c 'mv "$0" "$(printf %s "$0" | tr -d "\"")"' {} \;

O que você escreveu canaliza a saída de xargs para tr , não usa tr para formar o argumento para mv .

    
por 08.12.2014 / 23:33
3
xargs -0 -I {} mv {} {} | tr -d \"

não faz sentido: mv não produz saída. Portanto, você não pode construir pipelines com mv .

find . -name '*"*' -exec bash -c 'mv "$1" "${1//\"/}"' bash {} \;

ou com menos sobrecarga

find . -name '*"*' -exec bash -c 'for file in "$@"; do mv "$file" "${file//\"/}"; done' bash {} +
    
por 09.12.2014 / 00:17
1

Você pode fazer ...

mkdir ../_cp
pax -Xwrl -s'/"//gp' . "${PWD%/*}/_cp"

Isso cria um monte de hardlinks para todos os arquivos na hierarquia com base em . in ../_cp . Você pode então verificar se está tudo bem com os dois diretórios antes de remover um deles - afinal de contas, eles são basicamente os mesmos diretórios, exceto em um diretório, não há nomes de arquivos que contenham um " .

    
por 09.12.2014 / 05:33