如何使用带有变量值的ls命令?

时间:2015-08-03 04:02:11

标签: bash unix

我正在尝试创建一个脚本来列出 tmp1 / test / 中的文件夹。当我在ls命令中使用 source 时它无法正常工作。得到输出像 main.sh:第4行:tmp1 / test /:是一个目录。任何帮助???

source="tmp1/test/"
dest= "tmp2/" 

ls -F ${source} | grep '/' | awk -F'/' '{print$1}' > directories.txt

2 个答案:

答案 0 :(得分:1)

source= 'tmp1/test/'失败的原因有点复杂,但它是这样的。空格是Bash中的标记分隔符,每个标记依次展开(简化):

source=仅为此语句创建一个名为“source”的空变量

'tmp1/test/'是使用“source”变量

的命令的名称

当然,tmp1/test/不是命令或外部程序,因此是错误消息。因此,底线不要在作业中的=周围放置空格

这是另一种纯粹的bash,不依赖于ls(1)grep(1)awk(1)等外部程序:

source='tmp1/test/'
dest='tmp2/'     # NO spaces around = allowed 

# The * gets all the filenames
for fname in "$source/*"
do
    # The -d tests if it is a directory
    if [[ -d $fname ]]
    then
        echo "$fname"
    fi
# This redirects all standard output in the loop
done > directories.txt

您的解决方案有所不同。如果目录ls -F存在符号链接,则会在@末尾放置/,而不是for fname in "$source/*" do [[ -d $fname ]] && echo "$fname" done > directories.txt ,因此您的解决方案会遗漏这些内容。我的解决方案包括它们,但目录的符号链接并不常见,尽管我在OS X上使用它们。

循环的更简洁(但可以说是不太可读)版本可能是:

grep

顺便说一下,您可以通过以下方式避免解决方案中的ls -F "$source" | awk -F'/' '/\/$/{print $1}'

"$source"

请注意{ }周围的引号,以防目录名称包含嵌入的空格({{1}}在这种情况下无效)。

答案 1 :(得分:0)

我使用单引号在 source = 之后移除了空格。现在它的工作......

    Sub history()
    'x is set as the date of the current data set. It looks for the same date in a blank table and pastes the values below it

    x = Cells(20, 2)
    Range("B21:O34").Select
    Selection.Copy

    For i = 1 To 1000
    If Cells(3, i) = x Then

    Range((Cells(5, i).Address)).PasteSpecial Paste:=xlValue
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False


    Exit For
    Else
    End If
    Next i  

    End Sub