2016-07-14 148 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,你是对的。 –