使用大写文件和目录中的小写名称创建符号链接

时间:2014-12-28 21:20:43

标签: linux bash sh

我有一个目录,其中包含名称包含大写字母的文件和文件夹。 我想知道是否可以使用bash创建具有相同名称但小写的符号链接。

-rw-r--r-- 1 root root       570 Sep 22 00:00 AiA_SA_2014_08_10
-rw-r--r-- 1 root root       575 Sep 12 00:00 AiA_SA_Lite_2014_09_07
-rw-r--r-- 1 root root       570 Sep 22 00:00 AiA_SA_2014_08_10

-rw-r--r-- 1 root root       570 Sep 22 00:00 AiA_SA_2014_08_10
-rw-r--r-- 1 root root         x Sep 22 00:00 aia_sa_2014_08_10-> AiA_SA_2014_08_10
-rw-r--r-- 1 root root       575 Sep 12 00:00 AiA_SA_Lite_2014_09_07
-rw-r--r-- 1 root root         x Sep 12 00:00 aia_sa_lite_2014_09_07 -> AiA_SA_Lite_2014_09_07
-rw-r--r-- 1 root root       570 Sep 22 00:00 AiA_SA_2014_08_10
-rw-r--r-- 1 root root         x Sep 22 00:00 aia_sa_2014_08_10 -> AiA_SA_2014_08_10

4 个答案:

答案 0 :(得分:2)

是的,这是可能的。

使用简单的循环:

for i in *; do 
  [[ -f $i ]] || continue # in case of empty directory
  lcname=${i,,} # Covert the name to lowercase
  ln -s "$i" "$lcname"
done

如果您没有从当前目录运行,可以在for循环中提供完整路径。

答案 1 :(得分:2)

在最近的版本中,您可以使用,,参数扩展将字符串转换为小写:

shopt -s extglob
for file in *?([:upper:])* ; do
    ln -s "$file" "${file,,}"
done

extglob模式只选择名称中带有大写字母的文件。

答案 2 :(得分:2)

declare -l lower
for upper in *; do lower="$upper"; ln -s "$upper" "$lower"; done

答案 3 :(得分:1)

parallel ln -s {} '{=$_=lc($_)=}'  ::: *