在 Bash 中使用时,最好避免在文件名中使用字符,例如“?”

在 Bash 中使用时,最好避免在文件名中使用字符,例如“?”
  1. 例如:

    $ ls -l
    total 344
    -r-------- 1 t t 145657 Mar 11 01:53 joeltest-slides.pdf
    -rw-rw-r-- 1 t t 166814 Mar 11 01:55 The Joel Test: 12 Steps to Better Code? by Joel Spolsky.pdf
    drwx-w--w- 2 t t   4096 Sep 19  2012 The Joel Test 12 Steps to Better Code_files
    -rw--w--w- 1 t t  31940 Feb 12  2011 The Joel Test 12 Steps to Better Code.html
    $ mv The\ Joel\ Test\:\ 12\ Steps\ to\ Better\ Code{                                                                                                                 
    \ by\ Joel\ Spolsky.pdf,.pdf}
    mv: missing destination file operand after ‘The Joel Test: 12 Steps to Better Code{’
    Try 'mv --help' for more information.
    

    这是什么missing destination file operand意思?是因为? 文件名吗?

  2. 在Bash中,就通过内置或外部命令执行文件操作而言,命名文件时最好避免使用哪些字符?例如,

    上面的例子是否暗示?是其中之一?

    我之前的帖子暗示新行字符是其中之一?

    我以前的 帖子暗示空白是其中之一?

  3. 从 Linux 的角度来看,文件名中可以​​使用的字符没有限制,这是否正确?从文件系统类型 (ext4) 的角度来看都不是吗?

答案1

一个绝对规则是不能/在文件名中使用斜杠或空字节。斜杠是目录分隔符,不能转义。空字节表示名称的结尾并且也无法转义。除此之外,Linux 上允许使用任何字符(访问与其他文件系统共享的媒体或网络资源时除外),但多个字符可能会导致问题。我认为所有现代 *BSD 也允许除/和 null 字节之外的任何字符,但一些较旧的 unice 有更多限制。

如果您希望文件名在通用 shell 中工作而无需引用,则需要避免!"#$&'()*;<=>?[\]^`{|}~使用空格(空格、制表符、换行符)。~如果在最后就可以了。具体来说,在 bash 中,^是可以的,除了开头之外,在任何地方都是可以的,并且#除了作为命令名称之外都是可以的(因为它会被解释为赋值)。~=

除此之外,这里还有一些文件名可移植性建议,按重要性排序。

  • 文件名不要以-(破折号/连字符)开头。命令可能会将其解释为选项。
  • 不要使用首字母~(波形符),因为这在许多应用程序中表示“主目录”。
  • 更一般地,不要以标点符号开始或结束,因为许多应用程序为这些符号分配了特殊含义(例如,|foo表示“通过程序进行管道传输foo”而不是“写入文件|foo”,同样用于foo|输出)。
  • 如果您要与 Windows 用户交换文件,或将文件放在可移动媒体上,请不要使用 Windows 不支持的字符:\/?:*"><|
  • 不要使用不可打印的字符(例如控制字符)、制表符或换行符。您甚至无法在许多界面中输入它们。
  • 一些写得不好的 shell 脚本可能会在空间上以及\*?[]因为它们是通配符。此外,一些可以同时作用于多个文件的应用程序将这些字符解释为通配符。
  • 如果您要与旧计算机或使用不同语言的人交换文件,尤其是用非拉丁字母书写的语言,他们可能会使用不同的字符编码。这ASCII码保证字符在任何地方都可用并且以相同的方式编码。
  • 许多应用程序使用文件扩展名,找出他们支持哪些文件以及如何打开它们。系统还使用扩展名来确定使用哪个应用程序打开文件。因此,请将扩展保留在适当的位置。扩展名是最后一个点之后的部分,txt例如myfile.txt;有时有多个扩展名,例如myfile.txt.gz压缩 ( .gz) 文本 ( .txt) 文件。
  • .以are开头的文件名默认隐藏在命令的输出ls和许多文件浏览器中。
  • Unix 区分大小写:myfileMyfile.传统上,文件名都是小写的,主要是因为这样更容易输入。在过去,系统通常将大写字母排在小写字母之前,因此存在以大写字母开头的文件名的传统,以使其在目录列表中排在第一位,但现代系统通常不区分大小写地对名称进行排序。坚持使用小写可以避免混乱并且更容易打字。

如果您不想记住所有这些复杂的情况,这里有两个简单的规则:

  • 最大安全性:坚持使用字母az数字09加上-分隔单词,并.extension放在文件名的末尾。例如:my-file.txt
  • 更具可读性:在文件名末尾使用英文或您自己的脚本中的字母和数字,加上空格或-分隔单词。.extension例如:Jörgs Datei.txt

最后提示:对于日期,请使用 YYYYMMDD 格式(年-月日,年份为 4 位数字,月份和日期数字前导零),例如20150622-report.txt。这样,对文件名进行排序就可以按时间顺序排列。

相关内容