我正在尝试创建一个脚本来列出 tmp1 / test / 中的文件夹。当我在ls命令中使用 source 时它无法正常工作。得到输出像 main.sh:第4行:tmp1 / test /:是一个目录。任何帮助???
source="tmp1/test/"
dest= "tmp2/"
ls -F ${source} | grep '/' | awk -F'/' '{print$1}' > directories.txt
答案 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