小编Som*_*jee的帖子

“区分大小写是 Linux 文件系统的功能,而不是 Linux 操作系统”是什么意思?

我刚读到下面这句话:

区分大小写是 Linux 文件系统的功能,而不是 Linux 操作系统。

我从这句话中推断出的是,如果我在 Linux 机器上,但我正在使用使用 Windows 文件系统格式化的设备,那么区分大小写就不是一回事了。

我尝试了以下方法来验证这一点:

$ ~/Documents: mkdir Test temp

$ ~/Documents: touch Test/a.txt temp/b.txt

$ ~/Documents: ls te*
b.txt
Run Code Online (Sandbox Code Playgroud)

它只列出了 temp目录中,这是预期的,因为我在 Linux 文件系统中。

当我导航到 Windows 文件系统时(注意:我使用的是 WSL2),我仍然得到相同的结果,但我希望它列出两个目录中的文件而忽略区分大小写。

$ /mnt/d: mkdir Test temp

$ /mnt/d: touch Test/a.txt temp/b.txt

$ /mnt/d: ls te*
b.txt
Run Code Online (Sandbox Code Playgroud)

我用 bash 和 zsh 都试过了。

我觉得它与 bash(或 zsh)有某种关系,因为我也读到 bash 强制区分大小写,即使在使用不区分大小写的文件系统时也是如此。

此测试适用于 Powershell,因此这意味着文件系统确实不区分大小写。

filesystems bash zsh case-sensitivity

15
推荐指数
3
解决办法
4209
查看次数

如何遍历文件名的每个字符?

所以,我有一个简单的嵌套循环,其中外部for循环遍历目录中的所有文件,内部for循环遍历这些文件名的所有字符。

#!/bin/bash

if [ $# -lt 1 ]
then
        echo "Please provide an argument"
        exit
fi

for file in `ls $1`
do
        for ch in $file
        do
                echo $ch
        done
done
Run Code Online (Sandbox Code Playgroud)

上面的脚本不起作用。内部循环不会遍历文件名中的所有字符,而是遍历整个内容。

更新:

根据@ilkkachu 的回答,我想出了以下脚本,并且按预期工作。但是我很好奇我们可以不使用for...in循环来迭代字符串吗?

#!/bin/bash

if [ $# -lt 1 ]
then
        echo "Please provide an argument"
        exit
fi

for file in `ls $1`; do
        for ((i=0; i<${#file}; i++)); do
                printf "%q\n" "${file:i:1}"
        done
done
Run Code Online (Sandbox Code Playgroud)

bash shell-script

4
推荐指数
3
解决办法
1307
查看次数

标签 统计

bash ×2

case-sensitivity ×1

filesystems ×1

shell-script ×1

zsh ×1