簡體   English   中英

創建轉換文件名的符號鏈接 - Bash 腳本

[英]Create symbolic links transforming file names - Bash Script

我有一個 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 和文件名轉換有點陌生,因此將不勝感激任何幫助或指導。

結合使用 bash擴展正則表達式參數擴展

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

或更一般地說:

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 將被忽略。

更一般地,僅使用參數擴展:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM