![如何在一个文件夹中为另一个文件夹中的多个文件创建符号链接](https://linux22.com/image/919234/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E4%B8%BA%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%88%9B%E5%BB%BA%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5.png)
我正在使用 Ubuntu 18.04、19.04 和 19.10
为了gnome-shell
主题目的,我遇到了下面的情况。
admin@i7-4770:~$ ls /usr/share/themes/Yaru/gnome-shell/
calendar-today.svg noise-texture.png
checkbox-dark.svg no-notifications.svg
checkbox-focused-dark.svg pad-osd.css
checkbox-focused.svg pointer-double-click-symbolic.svg
checkbox-off-dark.svg pointer-drag-symbolic.svg
checkbox-off-focused-dark.svg pointer-primary-click-symbolic.svg
checkbox-off-focused.svg pointer-secondary-click-symbolic.svg
checkbox-off.svg process-working.svg
checkbox.svg running-indicator.svg
dash-placeholder.svg source-button-border.svg
gnome-shell.css summary-counter.svg
gnome-shell-high-contrast.css toggle-off-dark.svg
key-enter.svg toggle-off-hc.svg
key-hide.svg toggle-off-intl.svg
key-layout.svg toggle-off.svg
key-shift-latched-uppercase.svg toggle-on-dark.svg
key-shift.svg toggle-on-hc.svg
key-shift-uppercase.svg toggle-on-intl.svg
lockscreen-gradient.svg toggle-on.svg
logged-in-indicator.svg ws-switch-arrow-down.svg
message-indicator-symbolic.svg ws-switch-arrow-up.svg
no-events.svg
admin@i7-4770:~$
我需要为目录中上述输出的每个文件.svg
创建 一个符号链接。.png
/usr/share/gnome-shell/theme/
现在,我唯一的方法是ln -s
针对每个文件运行。
sudo ln -s /usr/share/themes/Yaru/gnome-shell/calendar-today.svg /usr/share/gnome-shell/theme/
我确信,专家可以很快完成。
我怎样才能实现这个目标?
答案1
这里根本不需要循环。只需运行此ln
命令:
sudo ln -s /usr/share/themes/Yaru/gnome-shell/*{png,svg} /usr/share/gnome-shell/theme/
在启动任何命令之前,shell 会处理括号扩展。因此上面的命令变为:
sudo ln -s /usr/share/themes/Yaru/gnome-shell/noise-texture.png /usr/share/themes/Yaru/gnome-shell/checkbox-dark.svg [...] /usr/share/themes/Yaru/gnome-shell/ws-switch-arrow-up.svg /usr/share/gnome-shell/theme/
换句话说,它变成了ln -s f1 f2 ... fN /path/to/target/dir
,这就是您链接所有文件所需的全部内容。例如:
$ ls foo/
file1.svg file2.svg file3.svg file4.png file5.png file6.png
$ ln -s $HOME/foo/*{svg,png} bar/
$ ls -l bar/
total 0
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file1.svg -> /home/terdon/foo/file1.svg
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file2.svg -> /home/terdon/foo/file2.svg
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file3.svg -> /home/terdon/foo/file3.svg
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file4.png -> /home/terdon/foo/file4.png
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file5.png -> /home/terdon/foo/file5.png
lrwxrwxrwx 1 terdon terdon 26 Dec 26 12:16 file6.png -> /home/terdon/foo/file6.png
如果由于某种原因必须使用循环,那么请使用 globs 代替:
for file in /usr/share/themes/Yaru/gnome-shell/*{png,svg}; do
sudo ln -s "$file" /usr/share/gnome-shell/theme/
done
答案2
经过多次谷歌搜索...
最终得到以下脚本
#!/bin/bash
for p in $(ls /usr/share/themes/Yaru/gnome-shell | grep '.svg\|.png'); do
sudo ln -s /usr/share/themes/Yaru/gnome-shell/$p /usr/share/gnome-shell/theme/
done
成功了。但我仍然认为专家可以使用在终端中输入的单个命令来实现。