testingfilesizecheck.sh: line 6: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
我正在使用命令for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*"
如果我非常具体地说,"/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin"
那么它就会起作用。
我是 Linux (Ubuntu) 和 bash 的新手,我正在努力使用 google-fu 来诊断这个问题。我能找到的每个示例站点都表明我使用通配符所做的事情应该可行,但它们将示例保存在与终端/bash脚本正在工作的目录相同的目录中。
在发表这篇文章之前,我确实使用 ls 制作了一个解决方法,这感觉非常迂回,因为我在文件夹中制作了文件列表,并且有点“手动”,而不是使用 for 循环作为简洁的命令。所以我正在寻找学术上的答案,为什么通配符在这种情况下不会扩展。
编辑:我尝试了将星号放在双引号之外的建议。但它也不起作用。以下是我现在的回复后的情况:
这是输入一行“bash testfilesizecheck.sh”并按 Enter 键后我的终端的复制粘贴:
doctor@doctor-X570-AORUS-ELITE:~/Documents$ bash testingfilesizecheck.sh
/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*
testingfilesizecheck.sh: line 24: /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/*: No such file or directory
第 24 行来自注释掉我在 testinfilesizecheck.sh 脚本中所做的所有其他尝试。这是该脚本减去注释掉的行。
#!/bin/bash
for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*
do
echo "$f"
actualsize=$(wc -c < "$f")
done
echo $actualsize
同样,在 /media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/ABRA.bin 处有一个文件
但通配符并未扩展以接受 ABRA.bin。在这两种变体中,它只是一个字面的星号。我想,是的,星号作为变量是有意义的,根据我对其他编程语言的初步理解,它不能出现在带引号的字符串中。但当然这对我不起作用。
答案1
双引号会阻止通配符*
(“glob”) 被扩展以匹配文件。相反,它会被视为文字星号字符。
使用此代替,其中通配符不带引号:
for f in '/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category'/*
这里重要的部分是包含空格或其他特殊字符的项目被引用,而通配符则不被引用。您同样可以使用以下任何变体(为了可读性而缩短路径):
'/media/…/Binary House/Final Structure Directory/Category'/*
'/media/…/Binary House/Final Structure Directory/Category/'*
/media/…/'Binary House/Final Structure Directory'/Category/*
/media/…/Binary' 'House/Final' 'Structure' 'Directory/Category/*
请注意,除非您设置了nullglob
( shopt -s nullglob
),否则没有匹配项的情况将导致您使用for
包含字面星号字符的路径对循环进行单次迭代。如果您无法设置,nullglob
则使用类似以下内容作为循环的第一行来防止“错误”扩展:
[ -e "$f" ] || continue
答案2
在收盘报价后添加 *:
for f in "/media/doctor/123A123E1A123456/Users/Tim/Downloads/PokemonRed/Binary House/Final Structure Directory/Category/"*; do echo f == "$f"; done