![Создать символическую ссылку на все файлы, но скопировать определенные расширения](https://rvso.com/image/1284422/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D1%83%D1%8E%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D1%83%20%D0%BD%D0%B0%20%D0%B2%D1%81%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%2C%20%D0%BD%D0%BE%20%D1%81%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%20%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F.png)
Мне интересно, как я смогу сделать символическую ссылку на все файлы в структуре каталога, а затем также скопировать файлы определенного расширения в этот каталог. Я в основном делаю символическую ссылку на все файлы в /foo/a,b,c в /bar/a,b,c, а затем копирую определенные файлы с определенными расширениями.
решение1
Из каталога /bar создать все символические ссылки для всего, кроме этих расширений.
find ../foo/ -type f ! -name '*.txt' ! -name '*.baz' -exec ln -s '{}' \;
А затем скопировать все расширения, по большей части та же команда.
find ../foo/ -type f \( -name "*.txt" -o -name "*.baz" \) -exec cp '{}' ./ \;
Редактировать: Копировать всю структуру каталогов, сделать симлинк для некоторых файлов, скопировать другие. Сначала не был уверен, возможно ли это с помощью одной команды, но только что узнал несколько других полезных трюков с find.
find foo/ -type d -printf "mkdir -vp 'bar/%p'\n" -o -type f ! -name "*.txt" ! -name "*.baz" -printf "ln -vs '../%p' 'bar/%p'\n" -o -type f \( -name "*.txt" -o -name "*.baz" \) -printf "cp -v %p bar/%p\n" | sh
mv bar/foo/* bar/ && rm -R bar/foo/
Единственное, что важно отметить, это то, что при создании символической ссылки вы указываете фактический путь, по которому ссылки будут относиться к foo/. В моем примере показаны относительные ссылки, когда они находятся рядом (также можно сделать и абсолютные символические ссылки).