如何删除'find'结果输出中的第一个和最后一个文件夹?

时间:2013-03-23 06:09:02

标签: bash

我想通过他们名字的一部分来搜索文件夹,我知道这些文件夹在这些文件夹中很常见。我在bash脚本中使用了'find'命令,就像这样

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

这两件事都没有用。任何人都可以指出任何提示使这项工作。 是的,它是家庭作业。

3 个答案:

答案 0 :(得分:1)

您可以使用parameter expansion

d=path/to/my/dir

d="${d#*/}" # remove the first dir
d="${d%/*}" # remove the last dir
echo $d     # "to/my"

答案 1 :(得分:0)

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

他们使用一种非常简单的正则表达式语言,其中*表示任何数字的任何字符和?是指任何单个字符。 sed命令使用更丰富的正则表达式语言,其中*表示前一个字符的任意数量。意味着任何角色(还有更多的角色)。

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

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

xargs -i dirname

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

我用

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

它打印了./abc

我误解了你想做什么吗?

答案 2 :(得分: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