2

我想按文件夹名称的一部分搜索文件夹,我知道这在这类文件夹中很常见。我像这样在 bash 脚本中使用了“查找”命令

find . -type d -name "*.hg" 

它只是打印出从当前目录到找到的文件夹本身的整个路径。foldr 名称有“.hg”。然后我尝试使用“sed”命令,但我无法解决路径的最后一部分。我决定让以 .hg 结尾的文件夹名称将其保存在一个变量中,然后使用“sed”命令从输出中删除最后一个目录。我用它来获取最后一部分,并尝试将结果保存到一个变量中,没有运气。

find . -type d -name "*.hg"|sed 's/*.hg$/ /'


find . -type d -name "*.hg"|awk -F/ '{print $NF}

这只是打印出文件名,这里是最后带有 .hg 的文件夹。然后我使用不同的方法

for i in $(find . -type d -name '*.hg' ); 
do
    $DIR = $(dirname ${i})
    echo $DIR
done

这也不起作用。谁能给我任何提示以使其有效。是的,这是家庭作业。

4

3 回答 3

1

您可以使用参数扩展

d=path/to/my/dir

d="${d#*/}" # remove the first dir
d="${d%/*}" # remove the last dir
echo $d     # "to/my"
于 2013-03-23T06:23:33.380 回答
0

您遇到的一个问题是您在 sed 脚本中使用的模式 - bash 和 find 命令都使用了不同的模式语言。

他们使用一种非常简单的正则表达式语言,其中 * 表示任意数量的任意字符,而 ? 表示任何单个字符。sed 命令使用更丰富的正则表达式语言,其中 * 表示任意数量的前一个字符,. 表示任何字符(除此之外还有很多)。

因此,要删除 find 传递的路径的最后一个组件,您需要使用以下 sed 命令: sed -e 's,/[^/].hg,,'

或者,您可以使用 dirname 命令。将 find 命令的输出通过管道传输到 xargs(它将运行一个将标准输入作为参数传递给命令的命令:

xargs -i 目录名

@Pamador - 这很奇怪。这个对我有用。只是为了解释一下: sed 命令需要用单引号引起来,以防止任何不需要的 shell 扩展。's' 后面的字符是逗号;我们在这里所做的是更改 sed 用来分隔替换命令的两个部分的字符,这意味着我们可以使用斜杠字符而不必在没有前面的反斜杠的情况下对其进行转义。下一部分匹配任何字符序列,除了斜杠后跟任何字符,然后是 hg。老实说,我应该用 $ 将模式锚定到行尾,但除此之外它很好。

我用它测试过

echo "./abc/xxx.hg" | sed -e 's,/[^/]\.hg$'

它打印了 ./abc

我误会你想做什么了吗?

于 2013-03-23T11:31:43.443 回答
0
find . -type d -name "*.hg" | awk -v m=1 -v n=1 'NR<=m{};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

awk 参数:

  • m = 要从输出开头删除的行数
  • n = 要从输出末尾删除的行数

奖励:如果您想从末尾删除 1 行并且安装了 coreutils,您可以这样做: find . -type d -name "*.hg" | ghead -n -1

于 2016-01-27T20:39:01.060 回答