通常,通配符扩展不包含点文件:
% echo *
Applications Desktop Documents Downloads Library Movies Music Pictures Public bin
如果我明确要求点文件,我会得到它们:
% echo * .*
Applications Desktop Documents Downloads Library Movies Music Pictures Public bin . .. .CFUserTextEncoding .DS_Store .Trash .adobe .bash_history .cups .gitconfig .gnupg .history .lesshst .netbeans .scanview.cfg .sqlite_history .ssh .swt .systemmodeler .tcshrc .viminfo
但是,我还得到.
和..
.我不想要这些,例如,如果我要传递到du -s
我想要目录中每个项目的大小的位置。是否有某种模式可以为我提供当前目录中的内容以及当前目录中不带 和 的所有.
内容..
?
我用的是tcsh。
(关于“这个问题在这里可能已经有答案:”,请注意上面:不,这个问题在那里没有答案,因为该答案仅适用于 bash。)
答案1
对于tcsh
6.17.01 及更高版本:
set globdot
du -s -- *
与年长的人:
du -s -- * .[^.]* ..?*
(有趣的是,这比它的 POSIX 对应项 ( ) 更好,* .[!.]* ..?*
因为在tcsh
(以及zsh
在csh
仿真 (cshnullglob
选项) 中),与 POSIX shell 相反,那些不匹配任何文件的模式将扩展为空而不是它们本身)
使用标准查找:
find . ! -name . -prune -exec du -s {} +
请注意,GNUdu
有一个-d
选项可以限制报告 dir 磁盘使用情况的深度:
du -ad1
答案2
您可以使用 ls -A 命令来不登记。和..内部命令替换:
echo "`ls -A`"
答案3
我通常使用:
du -ks * .[^.]*
这种方式.
与..
不匹配,并且应该相当便携。
答案4
没有简单的通用解决方案,因为它依赖于 shell:
对于 tcsh 或 bash:
echo .[^.]*
对于 ksh:
echo .*
但是,在 Nykakin 的情况下它将失败(以 .. 开头的文件)
对于更通用的答案,请使用“grep”或“find”,例如:
ls -a|grep '^\.\(..\|[^\.]\)'
这适用于我所知道的所有外壳,但没有 Nykakin 的外壳。还适用于其他解决方案可能失败的以下特殊情况:
.x
.x.
..x.
它的意思是:以一个点开头,后跟至少 2 个字符或一个非点的字符。