1

Я нахожусь под Linux и использую bash в качестве оболочки для входа. Мне нужно сделать softlink на кучу файлов. Эти файлы перечислены в текстовом файле, скажем, file_list.txt. Каждая строка в file_list.txt - это просто полный путь к одному целевому файлу, который необходимо связать. Хотя я не знаю точно, как это сделать, я верю, что есть способ объединить "cat", «|» и «ln -s» вместе, чтобы сделать работу одной командой оболочки. Так что нужна твоя помощь.

3 ответа3

2

Рассмотрим что-то вроде (не проверено):

for targ in $(cat file_list);
do
   tfile=$(basename $targ)
   ln -s $targ $tfile
done

Обратите внимание, что basename любое расширение файла, например, имя (например, «.exe» или что-то еще). Это можно исправить, но это боль. Вы можете иметь базовую полосу имени для любого отдельно взятого расширения имени файла, если хотите (используйте флаг -s ).

Вы можете сжать это в одну строку, например:

$ for targ in $(cat file_list); do tfile=$(basename $targ); ln -s $targ $tfile; done
2

Вы не говорите, на что хотите сослаться.

Используйте while цикла без cat Если в именах файлов есть пробелы, этот метод справится с этим.

while read -r line; do ln -s "$line" target; done < file_list.txt

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

1

Если вы хотите, чтобы имена в текущем каталоге (или в любом другом каталоге) и если имена в файле являются абсолютными или относительными именами, корректными относительно целевого каталога, то:

ln -s $(<file_list.txt) .

Если вы предпочитаете использовать «кошка», то:

ln -s $(cat file_list.txt) .

Ясно, что я использую текущий каталог в качестве цели.

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