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

我需要做的是在这些文件中找到“模式”,并将祖父母目录的名称改为“类型”名称......

4

3 回答 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

编辑

仅输入:

基本名和目录名:

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

使用 awk:

kent$  echo "/home/test/type1/log/pattern"|awk -F'/' '$0=$(NF-2)'    
type1
于 2013-05-21T16:32:22.477 回答
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来避免不良扩展。

于 2013-05-21T16:41:38.047 回答
1

这是一个简单的,替换:

echo $file;

在你的代码中

echo "Found `basename $file` in `dirname $file`";

并将其视为结果...

Found kbd in /etc
Found config in /etc/kbd
...
于 2013-05-21T16:39:23.667 回答