创建转换文件名的符号链接 - Bash脚本

时间:2014-03-01 21:13:05

标签: linux bash shell sed transform

我有一个bash脚本,它将遍历获取每个文件名的目录。我想要做的是为这些文件创建一些符号链接。除了我想更改链接名称。

示例1:

文件名: testFile.so.3.4.5

ln -s testFile.so.3.4.5 testFile.so.3
ln -s testFile.so.3 testFile.so

示例2:

文件名: testLink.so.4.4

ln -s testLink.so.4.4 testLink.so.4 
ln -s testLink.so.4 testLink.so

所以我需要将文件名转换两次。第一次删除除*.so之后的第一个数字以外的所有内容。第二次删除*.so之后的所有内容。

这是我到目前为止所拥有的。我知道这并不多:

#! /bin/bash

# clear any info on screen
clear

# greeting
echo "Starting the script!"

# loop through all files in the directory
for f in *
do
    echo "Processing: $f"
done

我对bash和文件名转换有点新,所以任何帮助或指导都会受到赞赏。

3 个答案:

答案 0 :(得分:3)

结合使用bash extended regular expressionsparameter expansion

for file in *.so.*
do
regex='(.*\.so\.[^.]*)\..*'
if [[ $file =~ $regex ]]
then
  tempfile="${BASH_REMATCH[1]}"
  ln -s "$file" "$tempfile"
  ln -s "$tempfile" "${tempfile%.*}"
fi
done

答案 1 :(得分:2)

或更一般地说:

files='libfoo.so.1.2.3.4.5 libbar.so libqux.so.1'

for f in $files; do
  while test ${f##*.} != so; do
    link=${f%.*}
    ln -s $f $link
    f=$link
  done
done

这将创建libfoo.so.1.2.3.4 -> libfoo.so.1.2.3.4.5libfoo.so.1.2.3 -> libfoo.so.1.2.3.4libfoo.so.1.2 -> libfoo.so.1.2.3libfoo.so.1 -> libfoo.so.1.2libfoo.so -> libfoo.so.1libqux.so -> libqux.so.1; libbar.so将被忽略。

答案 2 :(得分:2)

更一般地说,仅使用参数扩展:

for f in *.so.*.*
do
  if [ -e "$f" ]; then
    base=${f%".${f#*.so.*.*}"}
    ln -s "$f" "$base"
    ln -s "$base" "${base%.*}"
  fi
done