如何在一个文件夹中为另一个文件夹中的多个文件创建符号链接

如何在一个文件夹中为另一个文件夹中的多个文件创建符号链接

我正在使用 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

这样,你就不必担心任何奇怪的文件名,就像使用时ls。还请注意我如何引用,"$file"这也是基本的奇怪的文件名。

答案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

成功了。但我仍然认为专家可以使用在终端中输入的单个命令来实现。

相关内容