Переключить символическую ссылку и каталог

Вы не даете grep никаких файлов для поиска. Используйте

$ grep "#" testfile

или

$ grep "#" *

, а не просто

$ grep "#"
2
04.08.2017, 01:33
3 ответа

если бы мне приходилось делать это очень часто, Я бы написал вот такой небольшой bash-скрипт:

#!/bin/bash

echo "select symlink"
read -e -r symlink
echo "select directory"
read -e -r dir

var=$(echo "$dir" | sed 's/\///g')

rm "$symlink"
mv "$dir" "$symlink"
ln -s "$symlink" "$var"

Команда sedудаляет /, который добавляется при использовании автозаполнения -для ввода.
Обратите внимание,:это удалит их все, даже если вы выберете дерево каталогов.

Вы можете сказать sed, чтобы он совпадал только с концом строки :sed 's/\/*$//g'

2
27.01.2020, 21:53

Если каталоги находятся в одной файловой системе, mvтолько переименовывает каталог и не требует копирования. Просто удалите старую символическую ссылку, переименуйте каталог с помощью mvи создайте новую символическую ссылку.

2
27.01.2020, 21:53

Начиная с Linux 3.15 (и glibc 2.28 )системный вызов renameat2с параметром RENAME_EXCHANGEатомарно заменяет 2 объекта, например каталог и символическую ссылку. Хотя это не включает атомарный переключатель, он разрешает последовательность, в которой имена dirи dir_symlinkуказывают на каталог.

  1. Создайте символическую ссылку tmp, указывающую на tmp.
  2. Поменять местами tmpи dir.
  3. Замените dir_symlinkсимволической ссылкой, указывающей на tmp.
  4. Замените dirсимволической ссылкой, указывающей на dir_symlink.
  5. Поменять местами tmpи dir_symlink.
  6. Удалить tmp.

В до:

#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {

  symlink("tmp", "tmp");

  renameat2(AT_FDCWD, "tmp", AT_FDCWD, "dir", RENAME_EXCHANGE);

  symlink("tmp", "tmp_link");
  rename("tmp_link", "dir_symlink");

  symlink("dir_symlink", "tmp_link");
  rename("tmp_link", "dir");

  renameat2(AT_FDCWD, "tmp", AT_FDCWD, "dir_symlink", RENAME_EXCHANGE);

  unlink("tmp");
}
0
22.04.2020, 18:51

Теги

Похожие вопросы