我有一些文件,它们的名字是这样的
.abc efg.txt
.some other name has a dot in front.txt
......
我想做这样的事情
for i in `ls -a` ; do echo $i; done;
我预计结果应该是
.abc efg.txt
.some other name has a dot in front.txt
但结果却是一团乱糟糟的...... 我怎么能得到那些隐藏文件???
感谢
答案 0 :(得分:4)
而不是使用ls
使用shell模式匹配:
for i in .* ; do echo $i; done;
如果您想要隐藏和正常的所有文件,请执行以下操作:
for i in * .* ; do echo $i; done;
(请注意,这会让你.
和..
,如果你不想要那些你必须过滤那些,也请注意,如果没有(隐藏),这种方法会失败文件,在这种情况下,您还必须过滤掉*
和.*
)
如果您想要所有文件并且不介意使用bash
特定选项,则可以通过设置dotglob
和nullglob
来优化此选项。 dotglob
会*
也会找到隐藏文件(但不是.
和..
),nullglob
如果没有匹配则不会返回*
文件。因此,在这种情况下,您不必进行任何过滤:
shopt -s dotglob nullglob
for i in * ; do echo $i; done;
答案 1 :(得分:2)
要避免.
和..
,您可以这样做:
find . -name ".*" -type f -maxdepth 1 -exec basename {} ";"
这将打印您想要的内容。如果您需要执行超过echo
的操作,请将其作为exec
的参数。
for fname in .*; do echo $fname; done;
也会打印.
和..
。
答案 2 :(得分:1)
要查找隐藏文件,请使用find:
find . -wholename "./\.*"
要从结果中排除它们:
find . -wholename "./\.*" -prune -o -print
使用空格处理整个文件的另一种方法是将它们视为行:
ls -1a | while read aFileName
do
echo $aFileName
done