У меня есть каталог, содержащий около 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
Что именно я делаю не так, и как я могу это исправить? Спасибо!
Спасибо за помощь! Как я смогу сделать это для каждого файла в каждом из каталогов, если имена каталогов и файлов являются переменными?
Используйте найти;
Улучшенный ответ на основе комментария @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
Примечание; Я не тестировал команду, так как мы не уверены, как выглядит файловая структура.
Симлинки не могут быть относительными. Это должен быть полный путь к файлу.