一个?在ls

一个?在ls

当我尝试在 AIX 6.1 中复制(为了备份)一些文件时,我遇到了一些非标准字符的大问题。我需要做的是让备份存档具有完全相同的文件名,以便能够恢复文件并使其再次正常工作。

我尝试创建 ksh 脚本,该脚本将从 csv 文件中按名称(逐行)获取名称,并使用 cp 将它们复制到备份目标。运行脚本后,我意识到新位置缺少一些文件。经过一番调查后,我发现丢失的文件在原始目录中的名称中包含一些非标准字符(例如长 –、带重音符号的字母等)。

  1. 我有 csv 文件,其中包含要复制的文件列表,此处示例为长“–”:
    cat file_list.csv | grep pattern /path/to/file/some–file_with_pattern

  2. 当我尝试使用 cp 复制此特定文件时(通过脚本或手动运行 cp):
    cp /path/to/file/some–file_with_pattern /new/backup/path cp: /path/to/file/some–file_with_pattern: No such file or directory

  3. 当我用 ls 显示文件时:
    ls /path/to/file | grep pattern some?file_with_pattern

所以 AIX 会看到带有“?”的文件。而不是“–”,因此 cp 会抛出错误。当我使用通配符(*或?)复制文件时,它被复制但有“?”而不是目标目录中的“–”。当我将文件名放入“”或“”时,它是相同的“?”而不是目标目录中的“–”。这不能满足我的需要,因为当我用不同的名称(“?”而不是“–”)恢复文件时,使用它的应用程序将无法引用它。

我尝试了 ksh 和 sh(bash 在服务器上不可用)。我尝试使用语言环境(通过设置 LC_ALL="en_US.UTF-8" 强制使用 UTF8)。我尝试使用 Putty 编码设置。我仍然无法按文件的原始名称引用这些文件,因此无法保留原始名称来复制它们。有人知道如何使用 shell 命令复制这些文件吗?

答案1

这里需要解决三个不同的问题:

一个?ls

ls显示文件名中的真实字符是不正确的。

例如,以下文件名包含ls可能(并非总是)替换为 的字符?

$ eval "$(printf "a='\n' b=\032 c=–")"
$ touch test{"$a","$b","$c"}file
$ ls --quoting-style=literal test*
test?file  test?file  test–file

但这不会使用?(它是列出文件的外壳):

$ echo test*
test
file testfile test–file

当然,要显示字符(编码),请执行以下操作:

$ echo test* | od -An -tc
   t   e   s   t  \n   f   i   l   e       t   e   s   t 032   f   i   l   e
   t   e   s   t 342 200 223   f   i   l   e  \n

因此,您需要使用类似的东西od来真正查看文件中使用的字符。

$ touch 'some–file_with_pattern'
$ echo *pattern* | od -An -tc
   s   o   m   e 342 200 223   f   i   l   e   _   w   i   t   h   _   p   a   t   t   e   r   n  \n

编码

请注意,上面的长破折号始终正确显示为可见字符:(与示例中的 相对?),因为编码已正确设置为 utf-8。

因此,请检查翻译下的 PuTTY 设置,并确保将 UTF-8 设置为字符集。

然后尝试这一行,它应该打印出与您在此网页中看到的相同的字符。

$ echo 'áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά'
áé€íìïîößđ₣λŕžç×  Москва  Ελληνικά

文件系统编码

上述两个问题应该可以解决 99% 的情况,除非文件系统编码与区域设置编码不匹配或者涉及的两个文件系统之间不同。

在研究这个问题之前,请确保上述两个问题没有问题。读由于编码问题,同一文件,文件名不同?

相关内容