我想在 FreeBSD 9.2 中列出目录中的所有文件,但不想包含特定目录。我检查了-I
和--ignore
参数ls
,但I
只忽略超级用户模式并且--ignore
不受支持。
有人知道如何使用ls
或使用其他命令(如grep
)来执行该操作吗?
答案1
如果你想列出除特定目录之外的所有文件,notHere
你可以使用以下find
命令来执行此操作
find . -path ./notHere -prune -o -type f -print
解释:
.
:启动find
目录-path ./notHere
:启动与路径匹配的规则./notHere
-prune
:阻止find
进入当前匹配的目录-o
:添加一个,or
以指定当第一条规则不匹配时我们希望发生什么-type f
:仅匹配文件,而不是目录(如果您还想查看目录条目,请删除此项)-print
:通常不需要,因为它是默认操作,但有些版本find
仍然需要你明确说明希望打印结果
您提到想要其他输出(特别是ls -ll
),而不仅仅是文件名列表。 find
通常有一个内置函数来帮助实现这一点,尽管不是那些特定的选项ls
。您可以-print
用替换上面的标志-ls
,看看该选项集是否ls
足够接近您:
find . -path ./notHere -prune -o -type f -ls
或者如果这还不够好,您可以find
运行所需的命令,而不是尝试单独处理输出,例如:
find . -path ./notHere -prune -o -type f -exec ls -ll {} +
答案2
我使用此脚本过滤掉所有名称以“_”开头的文件夹。它可能不适用于有空格的文件夹,但你可以修改它。
#!/bin/sh
A=`ls /j/ | xargs | sed 's/_[a-z0-9]*//g' | awk '{$1=$1;print}'`
W=`echo $A | wc -w | tr -d '[[:space:]]'`
echo $W
总的来说,有趣的部分是这样的:
ls some_folder | xargs | sed 's/_[a-z0-9]*//g'
正则表达式_[a-z0-9]*
包含与应排除的名称匹配的模式。
如果您想要列出不-a
带选项的文件夹(仅显示名称),则可以使用此方法。如果您想使用,-a
那么最简单的方法是:
ls -la | grep -v skip_folder
其中skip_folder
是要排除的名称。如果文件夹包含空格,请使用引号,例如:
ls -la | grep -v "skip folder"