如何使包含符号链接的变量扩展到bash for循环?

时间:2013-05-29 09:33:55

标签: bash

假设我的dir中有一个目录$HOME,让它symlink。{

ln -s "$HOME/dir" "$HOME/.toDir"

然后,我们引入一个包含symlink

的变量
TO_DIR="$HOME/.toDir"

我想枚举TO_DIR指向的目录中的所有文件而不解析ls输出,这被认为是一种不好的做法(但它有效!),我尝试使用for循环没有成功:

for file in "$TO_DIR"/*
do
  # do something with $file
done

我没有文件,似乎$TO_DIR没有扩展到目录。

更新:它可以从命令行(交互式)运行,但不能从shell脚本运行。

3 个答案:

答案 0 :(得分:1)

我使用了以下脚本:

#!/bin/bash

TO_DIR="$HOME/.toDir"

for f in $TO_DIR/*; do
    echo $f
done

它运作正常:

$ ./test.bsh 
/home/stefanos/.toDir/a
/home/stefanos/.toDir/b

也许您尝试在脚本外部设置变量TO_DIR

答案 1 :(得分:0)

使用命令readlink

readlink symlink

将输出符号链接的目标。注意,不要像readlink symlink/那样调用它。

答案 2 :(得分:-2)

你最好不要使用这样的东西:

find -L "$TO_DIR" -maxdepth 1 -type f | while read filename; do
  dosomething "$filename"
done

这样我们就要求find找到“$ TO_DIR”中的所有文件,-L switch告诉它遵循符号链接。我们还保护循环 由于文件名的失败,通过阅读 使用while循环每行一个文件名。对于for循环 它会将带有空格的文件名分成单独的块 在空间分开。

以上也会找到名称为“$ TO_DIR / .hidden”的文件 可能想要注意这一点。