Конвертировать символические ссылки в соответствующие целевые файлы [дубликаты]

5

На этот вопрос уже есть ответ здесь:

У меня есть несколько символических ссылок на другие файлы в каталоге. Я хочу преобразовать эти ссылки в независимые файлы.

Есть команда, которая делает это?

Utkarsh Sinha
источник
это жесткие или мягкие (символические) ссылки?
seanwatson
Это мягкие ссылки - редактирование вопроса.
Utkarsh Sinha
Мне интересно знать, как это сделать для жестких ссылок.
Craig McQueen

Ответы:

8
cp --remove-destination "$(readlink <symlink>)" <symlink>
Ignacio Vazquez-Abrams
источник
Это было хорошо!
Utkarsh Sinha
1

Хотя Игнасио - хороший ответ, я хотел автоматизировать процесс для каждого файла, который является символической ссылкой в ​​текущем каталоге и подкаталогах.

Это делает трюк:

находить . -типа l -exec cp \ "{} \" \ "{}. tmp $$ \" \; -exec mv \ "{}. tmp $$ \" \ "{} \" \;

Надеюсь это поможет!

Cris70
источник
0

Первый способ, который мне приходит в голову, - это скопировать все ссылки на новые файлы и затем удалить все ссылки.

cp <link> <link>.new
rm <link>

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

seanwatson
источник
Это то, чем я занимаюсь до сих пор. Я надеялся, что в Unix будет какая-то команда, которая сделает это автоматически.
Utkarsh Sinha
0

К вашему сведению: Mac OS X не поддерживает --remove-назначения пометить, поэтому я написал простой скрипт для размещения в каталоге / usr / bin:

FILE=$1
TEMP=$1".tmp"

mv $FILE $TEMP

if [ -e $TEMP ]
then
    cp "$(readlink $TEMP)" $FILE

    if [ -f $FILE ]
    then
        rm $TEMP
    else
        echo "unln failed."
    fi
fi

Этот позволяет вам использовать подстановочные знаки:

for FILE in "$@"
do
    TEMP=$FILE".tmp"

    if [ -h $FILE ]
    then
        mv $FILE $TEMP

        if [ -e $TEMP ]
        then
            cp "$(readlink $TEMP)" $FILE

            if [ -f $FILE ]
            then
                rm $TEMP
            else
                echo "unln failed for link: $FILE"
            fi
        fi
    fi
done

источник