我有一个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和文件名转换有点新,所以任何帮助或指导都会受到赞赏。
答案 0 :(得分: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
答案 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.5
,libfoo.so.1.2.3 -> libfoo.so.1.2.3.4
,libfoo.so.1.2 -> libfoo.so.1.2.3
,libfoo.so.1 -> libfoo.so.1.2
,libfoo.so -> libfoo.so.1
和libqux.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