如何在 Linux 上处理文件名中的空格

您所在的位置:网站首页 shell怎么传有空格的变量文件 如何在 Linux 上处理文件名中的空格

如何在 Linux 上处理文件名中的空格

2024-05-09 05:04| 来源: 网络整理| 查看: 265

如何在 Linux 上处理文件名中的空格

简介: 如果您在 Linux 系统上有一个带空格的文件名,将您的文件名用引号括起来可以让 Bash 正确处理它。 Tab 完成使得在命令行中输入文件名变得容易,即使它们包含空格。

与大多数操作系统一样,Linux 支持文件名中包含空格。但是在命令行中使用这些文件名并不总是那么简单。以下是处理包含空格的文件名的几种方法。

不起眼的文件名

存储在计算机硬盘驱动器上的所有内容都需要有一个名称。没有名字,就没有文件存在。计算机启动时启动的所有应用程序和守护进程,以及您使用的所有软件,都必须被识别并存储在文件系统中。该标识是文件的名称。

这同样适用于您创建或安装的文件。您的所有文档、图像和音乐都需要文件名。没有文件名,您的数字资产将不复存在。因为文件名是如此重要,所以 Linux 努力尽可能少地强加关于它们的组成的规则。

在 Linux 上,文件名可以包含除正斜杠“/”和空字符 0x00 之外的任何字符。空字符用于标记字符串的结尾,因此它不能出现在字符串本身中,否则 Linux 会在空字符的位置截断文件名。 “/”正斜杠用作目录路径中的分隔符。

文件名区分大小写,最长可达 255 个字节,包括空字符。目录路径最长可达 4096 字节,包括空字符。请注意,这是以字节为单位的长度,可能不直接等于字符。例如,16 位 Unicode 字符每个占用两个字节。

复古计算爱好者和记忆力好的人会知道,在早期的个人电脑中,微软的磁盘操作系统 DOS 不区分大小写,文件名限制为八个字符,外加三个字符的扩展名。

命名文件时,您必须非常周到,有时还要有创意。相比之下,我们今天拥有的自由意味着我们可以随心所欲地命名文件,除了我们为该文件创建的描述之外,很少考虑其他任何事情。

但是对于文件名,最常让我们感到困惑的不是我们键入的字符,而是它们之间的空格。

为什么 Linux 文件名中的空格很麻烦

Bash 等 Shell 会将以空格分隔的字符串解释为单独的命令参数,而不是单个参数。下面是一个示例,使用 touch 创建一个名为“my new file.txt”的新文件。

touch my new file.txtls

如我们所见,ls 向我们显示创建了三个文件,一个名为“my”,另一个名为“new”,还有一个名为“file.txt”。

请注意,touch 没有抱怨或抛出错误。它执行它认为我们要求它做的事情。所以它默默地让我们回到命令行。如果我们没有动力去检查,我们就不会知道事情没有按计划进行。

要创建我们想要的文件,我们必须引用或转义。

如何引用和转义空格

如果我们引用整个文件名,touch 知道它需要将引用的文本视为单个参数。

touch 'my new file.txt'ls

这次我们得到了我们期望的单个文件。

如果我们使用反斜杠字符“\”来转义空格,我们可以得到相同的结果。通过“转义”空格,它们不被视为特殊字符——即参数分隔符——它们被认为是普通的旧空格。

touch my\ second\ new\ file.txtls

这行得通,但转义空格会使输入文件名变慢且容易出错。如果你的目录名中也有空格,事情会变得非常糟糕。

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bakls

该命令将单个文本文件从名为“dir one”的目录复制到名为“dir two”的目录,并将副本保存为 BAK 文件。这是一个相当简单的例子。

如何从源头上解决空间问题

如果它们是您自己的文件,您可以做出从不使用空格的政策决定,并像这样创建(或批量重命名)文件名。

mynewtextfile.txt

不可否认,这是一个强大的解决方案,但它仍然很丑陋。有更好的选择,例如使用破折号“-”或下划线“_”来分隔单词。

my-new-text-file.txtmy_new_text_file.txt

这两个都会回避问题,而且它们是可读的。如果不想在文件名中添加额外的字符,可以使用 CamelCase 使文件名可读,如下所示:

MyNewTextFile.txt选项卡扩展使处理空格变得容易

当然,只有在处理自己的文件时,采用并坚持命名约定才会有所帮助。来自其他任何地方的文件不太可能遵循您采用的命名约定。

您可以使用制表符扩展来帮助您准确地为我们“填写”文件名。假设我们要使用 rm 删除我们在“dir two”中创建的 BAK 文件。

我们首先输入“rm dir”,因为我们使用的是 rm 命令,并且我们知道目录名称以“dir”开头。

rm dir

按“Tab”键会导致 Bash 扫描当前目录中的匹配项。

有两个以“dir”开头的目录,在这两种情况下,下一个字符都是空格。所以 Bash 添加了反斜杠字符“\”和一个空格。 Bash 然后等待我们提供下一个字符。它需要下一个字符来区分此目录中的两个可能匹配项。

我们将键入“t”表示“two”,然后再次按“Tab”。

Bash 为我们完成目录名称并等待我们键入文件名的开头。

我们在这个目录中只有一个文件,所以输入文件名的第一个字母“m”足以让 Bash 知道我们要使用哪个文件。键入“m”并按“Tab”为我们完成文件名,“Enter”执行整个命令。

选项卡扩展可以轻松确保您获得正确的文件名,而且它还可以加快在命令行上的导航和键入的速度。

如何在 Bash 脚本中使用带空格的文件名

毫不奇怪,脚本在文件名中的空格问题与命令行完全相同。如果将文件名作为变量传递,请确保引用变量名。

这个小脚本会检查当前目录中是否有与文件模式“*.txt”匹配的文件,并将它们存储在名为 file_list 的变量中。 for 循环用于对每一个执行一个简单的操作。

#!/bin/bash file_list=*.txt for file in $file_list do   ls -hl $file done

将此文本复制到编辑器中并将其保存到名为“files.sh”的文件中。然后使用 chmod 命令使其可执行。

chmod +x files.sh

我们在这个目录中有一些文件。一个有一个简单的文件名,另外两个使用下划线“_”或破折号“-”而不是空格。这是我们在运行脚本时看到的。

./files.sh

这似乎很好用。但是,让我们为名称中包含空格的文件更改目录中的文件。

./files.sh

每个文件名中的每个单词都被当作一个单独的文件名来处理,因此脚本失败了。但是,要使脚本处理文件名中的空格,我们需要做的就是在 for 循环中引用 $file 变量。

#!/bin/bash file_list=*.txt for file in $file_list do ls -hl "$file" done

请注意,引号内有美元符号“$”。我们进行了更改并将其保存到“files.sh”脚本文件中。这次,文件名得到了正确处理。

./files.sh间隔开,但不片状

避免在您自己的文件名中使用空格只会让您走这么远。您不可避免地会遇到名称中包含空格的其他来源的文件。值得庆幸的是,如果您需要在命令行或脚本中处理这些文件,有一些简单的方法可以做到。

Linux Commands Files tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc Processes alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap Networking netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld

RELATED: Best Linux Laptops for Developers and Enthusiasts



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3