Como devo massificar renomear arquivos para corrigir a versão "conflitante" detectada pelo Dropbox (false) para a versão "não conflitante"?

2

Eu tenho um projeto com muitos arquivos, localizados em vários subdiretórios. O Dropbox de alguma forma substituiu as versões mais recentes de alguns desses arquivos com uma versão antiga e renomeou as mais recentes adicionando "(Johns in Konflikt stehende Kopie 2013-03-17) .txt" para tmen.

Agora, preciso renomear todos os arquivos que tenham essa adição "(Johns in Konflikt stehende Kopie 2013-03-17)" para o nome do arquivo original, removendo a versão antiga "autoritativa" (como o Dropbox os viu).

Existe um script de shell ou algo para executar no terminal para um determinado diretório, o que faria isso recursivamente em um diretório de destino?

Por exemplo: "filename (Johns em Konflikt stehende Kopie 2013-03-17)" deve ser renomeado para "filename" e caso já exista um arquivo chamado filename, remova-o primeiro.

    
por ejbs 24.03.2013 / 23:25

2 respostas

1

Isso funcionou para mim:

while read -r i;
do
        old_file=${i%%(*}
        rm $old_file
        mv "$i" "$old_file"
done <<< "$(find | grep "2013-03-17)$")"

Antes:

./files/filename2 (Johns in Konflikt stehende Kopie 2013-03-17)
./files/filename2
./files/filename (Johns in Konflikt stehende Kopie 2013-03-17)
./files/filename
./files/subfolder/filename (Johns in Konflikt stehende Kopie 2013-03-17)
./files/subfolder/filename

Depois:

./files/filename 
./files/filename2 
./files/subfolder/filename 

Faça um backup dos seus arquivos por precaução.

Explicação:

while read -r i; <<< "$(find | grep "2013-03-17)$")" lê todas as linhas da saída desse comando, que retorna path/filename para todos os arquivos terminados em 2013-03-17) - você pode precisar adicionar a extensão do arquivo ou obter apenas o nome de arquivo .

old_file=${i%%(*} define old_file como tudo na sequência produzida pelo comando find , ou seja, filename (Johns in Konflikt stehende Kopie 2013-03-17) e todos os outros, como todos antes de ( , ou seja, filename .

rm $old_file remove os arquivos antigos, ou seja, todos os nomes filename e filename2

mv "$i" "$old_file" renames filename (Johns in Konflikt stehende Kopie 2013-03-17) para filename

    
por 28.03.2013 / 02:24
1

Com base na resposta de Alex, eu escrevi um script que permite que você interativamente percorra a lista de arquivos em conflito e decida se deseja usar a cópia marcada como conflitante pelo Dropbox para substituir a cópia simples.

#!/bin/bash

counter=0
resolved=0
diffprompt=true 
mvprompt=true
mvall=false 
while read -r i
do
    if [ ! -f "$i" ]; then
        break;
    fi
    echo 
    echo "Found conflicted file:"
    echo "    $i"
    old_file='echo "$i" | sed 's/ (.*)//g''
    echo "    $old_file"
    if [ "$diffprompt" = true ]; then
        echo
        while true; do
            prompt1="Show diff between the two files [y/n]?"
            prompt2="press q to quit, r to stop diff prompts"
            read -p "...$prompt1 ($prompt2)" yn </dev/tty
            case $yn in
                [Yy]* ) diffuse "$i" "$old_file"; break;;
                [Nn]* ) break;;
                [Qq]* ) exit;;
                [Rr]* ) diffprompt=false; break;;
                * ) echo "Please answer yes or no.";;
            esac
        done
    fi

    if [ "$mvall" = true ]; then
        mv "$i" "$old_file"
    elif [ "$mvprompt" = true ]; then
        echo
        while true; do
            prompt3="Keep the conflicted version and"
            prompt4="overwrite the plain version [y/n]?"
            prompt5="press q to quit, r to stop mv prompts,"
            prompt6="a to move all files without prompting again"
            read -p "...$prompt3 $prompt4 ($prompt5 $prompt6)" yn </dev/tty
            case $yn in
                [Yy]* ) mv "$i" "$old_file"; resolved=$((resolved+1)); break;;
                [Aa]* ) mv "$i" "$old_file"; mvall=true; break;;
                [Nn]* ) break;;
                [Qq]* ) exit;;
                [Rr]* ) mvprompt=false; break;;
                * ) echo "Please answer yes or no.";;
            esac
        done
    fi
    counter=$((counter+1))
done <<< "$(find . -name '*(pmd-laptop*2014-08-06)*')"

# please note that my conflict device is called 'pmd-laptop'
# and that the date of the conflict is '2014-08-06'
# replace those in the find string according to your case

echo 
echo "Total number of conflicts = $counter"
echo "Conflicts resolved = $resolved"
    
por 07.08.2014 / 21:00