![目录列出两次](https://linux22.com/image/48965/%E7%9B%AE%E5%BD%95%E5%88%97%E5%87%BA%E4%B8%A4%E6%AC%A1.png)
我有一些奇怪的事情。我使用一个非常简单的脚本创建一些目录:
...创建所有目录(在具有正确权限的用户下运行)例如:
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre
但我得到的目录是双倍的!当我这样做时,ls -lrt
我得到
uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls -lrt
total 0
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 tre
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 err
drwxr-xr-x 2 wmb mqbrkrs 256 Jan 28 15:25 arc
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 tre
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 tbt
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 err
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 12 08:35 arc
drwxr-xr-x 2 wmb mqbrkrs 256 Jun 13 10:49 tbt
(注意双特、TBT、弧...)
他们的双目录确实指向相同的数据。
当你做正常的事情时ls
,你会得到
uxel081c: wmb - /home/EAI003A/05_EDSNFE/EAI2ISU/VEA # ls
tre tre
因此只有两个目录!
会发生什么 ?
答案1
如果我不得不冒险猜测,我会对这些文件以及它们的名称中是否包含不可打印的字符表示怀疑。您可以通过使用以下开关来显示这些特殊字符ls
。
Locating "non-printing" characters in file names
The ls command has all the options you need to detect "hidden" characters:
Command Function Sample Output
------- -------- ------ ------
ls hides/interprets nongraphic characters zzz
ls -b prints octal codes for nongraphic characters zzz\010\010\010aaa
ls -q prints question marks for nongraphic characters zzz???aaa
有关这些类型的字符和可移动字符的更多信息,请参阅上面引用的页面。
答案2
我的猜测是您在某个时刻在 Windows 上编辑了脚本,并且该版本有Windows 行结束符:CR(回车)后跟 LF(换行)。就Unix shell 而言,LF 是行结束符,CR 是普通字符。因此,如果您的脚本中有此内容(其中 ␍ 是 CR 字符):
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍
然后在你的编辑器中你只会看到
mkdir -p /home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre
但 shell 发现该mkdir
命令是使用参数-p
和调用的/home/EAI003A/05_EDSNFE/ISU2EAI/VEA/tre␍
。
当 CR 字符打印到终端上时,其效果是将光标移动到行首。使用 时ls -l
,CR 仅出现在行尾,因此没有可见的效果。对于 plain ls
,CR
每个第二个文件名末尾的 都会导致下一对文件名覆盖前面的行。
通过以下命令之一将脚本转换为使用 Unix 行结尾:
dos2unix /path/to/script # if dos2unix is available
sed -i -e $'s/\r//' /path/to/script # on Linux or Cygwin only
perl -i -e 's/\r$//' /path/to/script
您的编辑可能也有办法做到这一点。在编辑器中,当您编辑 shell 脚本时,请检查行结尾是否为“LF”、“Unix”或“Linux”,而不是“CRLF”、“Windows”或“DOS”。
根据您的 UNIX 变体,尝试ls -b
或ls -Q
或ls -q
使文件名中的特殊字符出现。要合并两个目录,请首先将文件移动到正确的目录中,然后删除另一个目录。
mv -i tre/* tre?/
rmdir tre?/