如何从Shell中的路径列表中删除文件名

时间:2016-02-04 05:51:56

标签: bash shell

我想仅从以下配置文件中删除文件名。

配置文件 - test.conf

knowledgebase/arun/test.rf
knowledgebase/arunraj/tester/test.drl
knowledgebase/arunraj2/arun/test/tester.drl

应阅读上述文件。删除的内容应该转到另一个名为 output.txt

的文件中

以下是我的尝试。它根本不适合我。我只收到空文件。

#!/bin/bash
file=test.conf
while IFS= read -r line
do
#       grep --exclude=*.drl line
#       awk 'BEGIN {getline line ; gsub("*.drl","", line) ; print line}'
#       awk '{ gsub("/",".drl",$NF); print line }' arun.conf
#       awk 'NF{NF--};1' line arun.conf
echo $line | rev | cut -d'/' -f 1 | rev >> output.txt
done < "$file"

预期输出:

knowledgebase/arun
knowledgebase/arunraj/tester
knowledgebase/arunraj2/arun/test

3 个答案:

答案 0 :(得分:3)

dirname命令使其变得简单可靠:

#!/bin/bash
file=test.conf
while IFS= read -r line
do
    dirname "$line"
done < "$file" > output.txt

Bash shell parameter expansions可以使用给定的名称列表,但对于某些名称不能可靠地运行:

file=test.conf
while IFS= read -r line
do
    echo "${line%/*}"
done < "$file" > output.txt

sed来完成这项工作 - 很容易使用给定的名称集:

sed 's%/[^/]*$%%' test.conf > output.txt

如果你不得不处理像/plain.file(或plain.file这样的名称 - 与shell扩展相同的各种边缘情况,那就更难了。)

您可以将Perl,Python,Awk变体添加到完成工作的方式列表中。

答案 1 :(得分:2)

使用awk one liner,你可以这样做:

awk 'BEGIN{FS=OFS="/"} {NF--} 1' test.conf

<强>输出:

knowledgebase/arun
knowledgebase/arunraj/tester
knowledgebase/arunraj2/arun/test

答案 2 :(得分:1)

你可以得到这样的路径:

  path=${fullpath%/*}

它在最后一个/

之后切掉了字符串