![](/img/trans.png)
[英]Shell, For loop into directories and sub directory not working as intended
[英]Hide sub directories in while loop
我需要制作一个创建软/符号链接的脚本,但是还应该检测“〜/ linkedfiles”目录中是否已经存在链接,但是问题是$ file还包含子目录。 ($ file看起来像这样:“〜/ realfiles / files / file23.gz”,但是我只需要“ file23.gz”。)所以我的问题是,如何删除$ file中的子目录?
这是一些示例代码:
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
似乎您需要路径的基本名称。 有两种方法可以做到这一点-经典的可靠方法是使用basename
命令,而现代的但并非总是可靠的方法是使用shell参数扩展 。
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
,我想这就是您想要的(尽管仍有提高该问题清晰度的空间,例如通过引用样本文件名的所需结果)。
稍微修改原始脚本即可
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
笔记
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.