Почему моя команда для создания символических ссылок на один тип файла в каждом каталоге в моем текущем каталоге не работает?

У меня есть каталог, содержащий около 500 каталогов. В каждом из этих 500 каталогов есть два нужных мне файла: один с расширением .bam, а другой с расширением .bai. Я пытаюсь создать символические ссылки на все файлы, заканчивающиеся на .bam или .bai, в новом месте.

Мои каталоги структурированы следующим образом:

/Parent_Directory/[500_Subdirectories]/file.bam 

И мой каталог назначения:

/New_Directory/bam_folder/

Теперь у меня возникают проблемы с моим текущим кодом:

for d in Parent_Directory; do  
    ( cd "$d" && ln -s *.ba* New_Directory/Bam_Folder ); 
done

Что, кажется, продолжает происходить, так это то, что я создаю символическую ссылку в моем каталоге Bam_Folder на несуществующий файл с именем .ba

Что именно я делаю не так, и как я могу это исправить? Спасибо!

Симлинки не могут быть относительными. Это должен быть полный путь к файлу.

0stone0 18.12.2020 17:06

Спасибо за помощь! Как я смогу сделать это для каждого файла в каждом из каталогов, если имена каталогов и файлов являются переменными?

Skinny_Genes 18.12.2020 17:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте найти;


Улучшенный ответ на основе комментария @oguz ismail, который предотвращает запуск программы для каждого файла, вместо этого он выполняется только один раз для всех файлов;

find /Parent_Directory/ -iname '*.bam' -exec ln -s -t /New_Directory/bam_folder {} +

Оригинальный ответ:

find /Parent_Directory/ -iname '*.bam' -exec ln -s {} /New_Directory/bam_folder/ ';'
  • -iname '*.bam'
    • Файлы, оканчивающиеся на .bam
  • -exec ln -s {} /New_Directory/bam_folder/
    • {} — путь найденного предмета (полный)
    • Второй аргумент - это путь, по которому будет идти символическая ссылка.

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


Примечание; Я не тестировал команду, так как мы не уверены, как выглядит файловая структура.

Другие вопросы по теме