2016-07-14 147 views
0

我需要創建一個腳本來創建軟/符號鏈接,但還應該檢測鏈接是否已存在於'〜/ linkedfiles'目錄中,但問題是$文件還包含子目錄。 ($文件將如下所示:'〜/ realfiles/files/file23.gz',但我只需要'file23.gz')。所以我的問題是,我如何刪除$文件中的子目錄?在while循環中隱藏子目錄

下面是一些代碼爲例:

for file in ~/realfiles/files/*.gz 
do 

echo "Linking file: $file" 
ln -s $file ~/linkedfiles 
if [ $? -ne 0 ]; then 
echo "[FAIL] Linking of $file failed!" 
else 
echo "[SUCCESS] $file successfully linked." 
fi 
done 
+0

'man find',搜索'-type'。 – bishop

+0

根據你的代碼,'$ file'將包含'.gz'文件。它如何包含子目錄? – Fazlin

回答

1

看起來您需要路徑的基本名稱。有兩種方法可以做到這一點 - 典型的可靠方法是使用basename命令,現代的並非總是可靠的方法是使用shell parameter expansion

for file in ~/realfiles/files/*.gz 
do 
    echo "Linking file: $file" 
    ln -s "$file" "~/linkedfiles/$(basename "$file")" 
    if [ $? -ne 0 ] 
    then echo "[FAIL] Linking of $file failed!" 
    else echo "[SUCCESS] $file successfully linked." 
    fi 
done 

或者:

for file in ~/realfiles/files/*.gz 
do 
    echo "Linking file: $file" 
    ln -s "$file" "~/linkedfiles/${file##*/}" 
    if [ $? -ne 0 ] 
    then echo "[FAIL] Linking of $file failed!" 
    else echo "[SUCCESS] $file successfully linked." 
    fi 
done 

在這兩個腳本,文件~/realfiles/files/file23.gz將與~/linkedfiles/file23.gz,這是你我想以後(雖然有提升空間問題的清晰度,例如通過引用樣本文件名的期望結果)。

0

原始腳本的輕微的修改會做

for filename in ~/realfiles/files/*.gz 
do 
echo "Linking file: $file" 
[[ -h "~/linkedfiles/${var##*/}" ]] && continue 
ln -s "$filename" ~/linkedfiles/ 
if [ $? -ne 0 ] 
then 
    echo "[FAIL] Linking of $filename failed!" 
else 
    echo "[SUCCESS] $filename successfully linked." 
fi 
done 

注意

+0

'find'並沒有真正添加任何超過'-h'已經做過的事情(儘管你可以在'find'命令中加入'!-type l'並在循環中刪除'-h'測試)。 – chepner

0
targetdir="$HOME/linkedfiles"  
for filename in $HOME/realfiles/files/*.gz; do 
    # if filename is a regular file then ... 
    if [[ -f "${filename}" ]]; then 
     # if softlink does not exist in target then link it 
     if [[ ! -h "${targetdir}/${filename##*/}" ]]; then 
      echo "Linking ${filename}" 
      ln -s "${filename}" "${targetdir}" 
      (($? == 0)) && echo 'Link created' || echo 'Create link fails' 
     else 
      echo "Skipping because ${filename##*/} exists in ${targetdir}" 
     fi 
    fi 
done 
+0

我更喜歡使用:ln -sf $ {filename} targetdir –

+0

'cmd; (($?== 0))&& echo'更簡潔,地道,可移植的寫成'cmd && echo'。 – tripleee

+0

@tripleee,你是對的。 –