Вы не даете grep
никаких файлов для поиска. Используйте
$ grep "#" testfile
или
$ grep "#" *
, а не просто
$ grep "#"
если бы мне приходилось делать это очень часто, Я бы написал вот такой небольшой 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'
Если каталоги находятся в одной файловой системе, mv
только переименовывает каталог и не требует копирования. Просто удалите старую символическую ссылку, переименуйте каталог с помощью mv
и создайте новую символическую ссылку.
Начиная с Linux 3.15 (и glibc 2.28 )системный вызов renameat2
с параметром RENAME_EXCHANGE
атомарно заменяет 2 объекта, например каталог и символическую ссылку. Хотя это не включает атомарный переключатель, он разрешает последовательность, в которой имена dir
и dir_symlink
указывают на каталог.
tmp
, указывающую на tmp
. tmp
и dir
. dir_symlink
символической ссылкой, указывающей на tmp
. dir
символической ссылкой, указывающей на dir_symlink
. tmp
и dir_symlink
. 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");
}