Shell:如何获取文件所在指定父目录的名称?

3

我是一个Shell编程的初学者。我正在编写一个脚本来操作找到的文件。但我需要获取找到的文件的父目录名称。例如,

SEARCH_PATH=/home/test
for file in `find $SEARCH_PATH -name "pattern"`;
do
        echo $file;
done

在搜索路径中,有几个文件夹具有相同的文件模式。
/home/test/type1/log/pattern
/home/test/type2/log/pattern
/home/test/type3/log/pattern

我需要做的是在这些文件中找到“pattern”,并获取上级目录的名称作为“type”名称...


1
你可能会对 readlink -f filename 感兴趣,它可以给你文件名的绝对路径。 - Bort
3个回答

2

简单粗暴:

kent$  dirname $(dirname "/home/test/type1/log/pattern")
/home/test/type1

如果您的文件名中没有/,您也可以使用sed、awk或cut等工具。下面是一个sed的例子:
kent$  echo "/home/test/type1/log/pattern"|sed 's#/[^/]*/[^/]*$##'                                                                                                          
/home/test/type1

编辑

仅输入类型:

basename和dirname:

kent$  basename $(dirname $(dirname "/home/test/type1/log/pattern"))                                                                                                        
type1

使用awk:

kent$  echo "/home/test/type1/log/pattern"|awk -F'/' '$0=$(NF-2)'    
type1

我怎么能只获取'type1',而不是在开头包含'/home/test/'呢? - AplusG
谢谢,这正是我所期望的。可能有点不干净,但是能够工作。 :) - AplusG

1
这是一个简单的问题,替换为:

echo $file;

在你的代码中
echo "Found `basename $file` in `dirname $file`";

看到以下结果...
Found kbd in /etc
Found config in /etc/kbd
...

1
一种通用解决方案:

SEARCH_PATH=/home/test
find "$SEARCH_PATH" -name 'pattern' | rev | cut -d'/' -f3- | rev

# Step by step explanations:
# 1. `find` Search all the files for the given pattern (e.g.: "/a/b/c/d")
# 2. `rev` Reverse each line (e.g.: "d/c/b/a/")
# 3. `cut` Remove the filename and the direct parent (e.g.: "b/a/")
# 4. `rev` Reverse each line again (e.g.: "/a/b")

请注意,我在$SEARCH_PATH周围使用双引号以避免在某些情况下发生错误扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接