2014-03-01 66 views
2

我有一个bash脚本,将通过获取每个文件名的目录循环。我想要做的是为这些文件创建一些符号链接。除了我想更改链接名称。创建符号链接转换文件名 - 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 

我有点新的抨击和文件名的转换,所以任何帮助或指导,将不胜感激。

回答

3

使用bash extended regular expressions的组合和parameter 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 
+0

真棒!这正是我需要的。 – Will

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.1,和libqux.so -> libqux.so.1; libbar.so将被忽略。

2

而且更普遍,只用参数扩展:

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