2

У меня есть проект с большим количеством файлов, расположенных в нескольких подкаталогах. Dropbox каким-то образом заменил последние версии некоторых из этих файлов старой версией и переименовал последние, добавив "(Johns in Konflikt stehende Kopie 2013-03-17).txt" в tmen.

Теперь мне нужно переименовать все файлы с этим дополнением «(Johns in Konflikt stehende Kopie 2013-03-17)» в исходное имя файла, удалив старую "официальную" версию (как их видел Dropbox).

Есть ли сценарий оболочки или что-то для запуска в терминале для определенного каталога, который будет делать это рекурсивно для целевого каталога?

Например:«имя файла (Johns in Konflikt stehende Kopie 2013-03-17)» следует переименовать в "имя файла", и, если файл с именем filename уже существует, сначала удалите его.

2 ответа2

1

На основе ответа Алекса я написал скрипт, который позволяет в интерактивном режиме просматривать список конфликтующих файлов и решать, хотите ли вы использовать копию, помеченную как конфликтующую в Dropbox, для замены обычной копии.

#!/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"
1

Это сработало для меня:

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

До:

./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

После:

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

Сделайте резервную копию ваших файлов на всякий случай.

Объяснение:

while read -r i; <<< "$(find | grep "2013-03-17)$")" считывает все строки из выходных данных этой команды, которая возвращает path/filename для всех файлов, заканчивающихся в 2013-03-17) - вы можете Нужно добавить расширение файла или получить только имя файла.

old_file=${i%%(*} устанавливает old_file как все в строке, выводимой командой find , то есть filename (Johns in Konflikt stehende Kopie 2013-03-17) и все остальные, как и все ранее ( то есть , filename .

rm $old_file удаляет старые файлы, то есть все с именами filename и filename2

mv "$i" "$old_file" переименовывает filename (Johns in Konflikt stehende Kopie 2013-03-17) в filename

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .