通配符不适用于不同目录(和分区)的“for f in ...”

通配符不适用于不同目录(和分区)的“for f in ...”
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

相关内容