Создать символическую ссылку из find

Я пытаюсь создать символическую ссылку (мягкую ссылку) из результатов команды поиска. Я использую sed для удаления ./ перед именем файла. Я делаю это, чтобы вставить имя файла в конец пути, где будет сохранена ссылка. Я работаю над этим с Ubuntu Server 8.04.

Я узнал из этого поста, который является своего рода решением моей проблемы, но не совсем

Как мне выборочно создавать символические ссылки на определенные файлы в другом каталоге в LINUX?

Однако получившееся имя файла не сработало, поэтому я начал изучать awk, а затем остановился на sed.

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

Я хорошо разбираюсь в основных командах bash, но я далек от того, чтобы быть экспертом в командной строке. Я начал это с ls и awk и перешел к find и sed. Мой синтаксис sed, вероятно, мог бы быть лучше, но я изучил это за два дня, и сейчас я как бы застрял.

для t в find -type f -name "*txt*" | sed -e 's/.//' -e 's$/$$'; do echo ln -s $t ../folder2/$t; сделано

Любая помощь или подсказки больш были бы оценены. Спасибо.


person mark    schedule 27.11.2012    source источник
comment
Вы можете избежать ./ в выводе find, передав список путей. find */ -options ... Я думаю, что это тоже может быть вариантом.   -  person tripleee    schedule 27.11.2012
comment
Проблема с неработающими ссылками заключается в том, что относительные пути должны относиться к месту назначения ссылки. Перепишите, чтобы запустить цикл на один каталог вверх (find source -options ... -exec ln -s '{}' target \;), используйте абсолютные пути или расширьте свой сценарий sed, чтобы разрешить цель ссылки относительно места назначения (тривиально добавьте ../source/ впереди). Первый аргумент ln -s никак не переписывается, он используется дословно как содержимое символической ссылки, нет требования или проверки, что он разрешается в существующий файл во время создания ссылки.   -  person tripleee    schedule 27.11.2012
comment
Я думаю, вы имеете в виду sed 's%^\./%%'. Чтобы разрешить косую черту в регулярном выражении, sed позволяет вам использовать любой знак препинания после команды s, хотя косая черта является традиционным разделителем по умолчанию, имитируя символ поиска в vi и ed перед ним. В качестве альтернативы вы можете экранировать разделитель обратной косой чертой, чтобы указать его как буквальный символ в выражении.   -  person tripleee    schedule 27.11.2012


Ответы (2)


Полегче:

Перейдите в папку, в которую вы хотите поместить файлы, и выполните:

find /path/with/files -type f -name "*txt*" -exec ln -s {} . ';'
person Florian Schicker    schedule 24.09.2013

Выполните цикл for следующим образом:

(IFS=$'\n'; for t in `find -type f -name "*txt*" | sed 's|.*/||'`; do ln -s $t ../folder2/$t; done)

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

Скобки нужны для того, чтобы убедиться, что цикл выполняется во вложенной оболочке, а IFS текущей оболочки не изменяется.

person Guru    schedule 27.11.2012
comment
Спасибо! Это то, что я искал. Я не был уверен, правильно ли использую команды find и sed, и вы помогли мне увидеть, где мне нужно внести необходимые изменения. Читая, я увидел, что могу использовать другие символы (например, %) в sed. В примере, который я видел, использовалось $, поэтому я попробовал, и это сработало. Я попытаюсь изменить синтаксис sed, используя ваши советы, и, надеюсь, это заработает. Спасибо еще раз. - person mark; 27.11.2012