在 FreeBSD 中从 `ls -R` 命令中排除目录

在 FreeBSD 中从 `ls -R` 命令中排除目录

我想在 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"

相关内容