感谢您考虑提供帮助。
我正在尝试创建一个简单的shell脚本,一旦运行,它将查看通常为大写形式的文件夹的所有目录,并以小写形式创建该目录的符号链接。然后,我将定期执行此脚本,因为新文件夹已添加到目录中,以便为新文件夹创建其他符号链接。该脚本必须知道已经为其创建了符号链接的其他文件夹,以免创建任何停止问题或错误。下面是我想要实现的目标的可视化。
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Holmes
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Kingship
-rwxrwxrwx 1 root root 85 Jun 18 04:39 link.sh
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Lost
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Monkey
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Space Ship
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Test
到
lrwxrwxrwx 1 root root 6 Jun 18 04:49 holmes -> Holmes
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Holmes
lrwxrwxrwx 1 root root 8 Jun 18 04:49 kingship -> Kingship
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Kingship
-rwxrwxrwx 1 root root 85 Jun 18 04:39 link.sh
lrwxrwxrwx 1 root root 4 Jun 18 04:49 lost -> Lost
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Lost
lrwxrwxrwx 1 root root 6 Jun 18 04:49 monkey -> Monkey
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Monkey
lrwxrwxrwx 1 root root 10 Jun 18 04:49 space ship -> Space Ship
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Space Ship
lrwxrwxrwx 1 root root 4 Jun 18 04:49 test -> Test
drwxr-xr-x 2 root root 4096 Jun 18 03:52 Test
显然,该脚本必须能够为稍后创建的文件夹创建新的符号链接,但还没有符号链接。
我一直在修改其他两个帖子/答案的语法,并没有真正得到其他任何地方,然后重新创建个别答案的结果。帖子位于Using find on subdirectories and create symlinks to all files和Bash script to automatically create symlinks to subdirectories in a tree
也许我会用错误的方法来解决我的问题。我实际上想要实现的是这是一个NAS系统,它具有基于用户名自动创建的文件夹。然后通过samba homes共享自动共享文件夹。但是,除非创建小写文件夹,否则无法访问共享,因为文件夹最初是使用空格创建的,并且使用用户名的大小写结构。用户名的结构与unix系统完全兼容,因为在unix系统上进行测试和测试是两回事。我已经研究过如何允许使用大写创建用户名,但是这些更改并不会影响samba共享识别文件夹的方式。
答案 0 :(得分:2)
一步一步的方式:
首先,在暂存目录中,我正在创建像你这样的目录样本:
$ mkdir Holmes Kingship Lost Monkey 'Space Ship' Test a_lower_case_one
$ touch just_a_file One_with_UpperCase
$ ln -s Holmes holmes
$ ls -og
total 28
drwxr-xr-x 2 4096 Jun 18 11:54 a_lower_case_one
lrwxrwxrwx 1 6 Jun 18 11:54 holmes -> Holmes
drwxr-xr-x 2 4096 Jun 18 11:54 Holmes
-rw-r--r-- 1 0 Jun 18 11:54 just_a_file
drwxr-xr-x 2 4096 Jun 18 11:54 Kingship
drwxr-xr-x 2 4096 Jun 18 11:54 Lost
drwxr-xr-x 2 4096 Jun 18 11:54 Monkey
-rw-r--r-- 1 0 Jun 18 11:54 One_with_UpperCase
drwxr-xr-x 2 4096 Jun 18 11:54 Space Ship
drwxr-xr-x 2 4096 Jun 18 11:54 Test
现在,您将如何遍历目录?像这样:
$ for i in */; do echo "$i"; done
a_lower_case_one/
holmes/
Holmes/
Kingship/
Lost/
Monkey/
Space Ship/
Test/
如何在bash中以小写形式转换变量?根据{{3}},${i,,}
的扩展将是$i
的小写扩展:
$ for i in */; do echo "$i -> ${i,,}"; done
a_lower_case_one/ -> a_lower_case_one/
holmes/ -> holmes/
Holmes/ -> holmes/
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/
现在我们只能考虑与小写扩展不同的目录名称:
$ for i in */; do [[ $i = ${i,,} ]] && continue; echo "$i -> ${i,,}"; done
Holmes/ -> holmes/
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/
对于其中的每一个,我们将测试是否已存在小写的现有:
$ for i in */; do [[ $i = ${i,,} ]] && continue; echo "$i -> ${i,,}"; if [[ -e ${i,,} ]]; then echo " ${i,,} exists"; fi; done
Holmes/ -> holmes/
holmes/ exists
Kingship/ -> kingship/
Lost/ -> lost/
Monkey/ -> monkey/
Space Ship/ -> space ship/
Test/ -> test/
当小写的已存在时,我们将检查它是否是链接到大写的链接。如果是,一切都很好,否则我们会打印一个警告。因为它有点大,我将把它写成bash
脚本:
#!/bin/bash
for i in */; do
d=${i%/}
dl=${d,,}
[[ $d = $dl ]] && continue
if [[ -e $dl ]]; then
if [[ ! -L $dl ]]; then
echo " ERROR: $dl is not a link"
elif [[ $(readlink -- "$dl") != $d ]]; then
echo " ERROR $dl exists and doesn't point to $d"
fi
else
ln -sv -- "$d" "$dl"
fi
done
我已经使用了我所知道的所有最佳实践,以便拥有一个健壮的脚本,对文件名中的有趣符号(空格,连字符等等)安全。
注意。必须从要处理的目录中调用。如有必要,请在此脚本的顶部使用cd
。
希望这有帮助!