Shell:如何在文件的指定父目录名下?

时间:2013-05-21 16:29:45

标签: linux bash shell

我是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'这个名字......

3 个答案:

答案 0 :(得分:2)

又脏又快:

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

如果您的文件名中没有/,您也可以使用sed,awk cut ....一个例子:

kent$  echo "/home/test/type1/log/pattern"|sed 's#/[^/]*/[^/]*$##'                                                                                                          
/home/test/type1

编辑

仅输入:

basename&目录名称:

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

用awk:

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

答案 1 :(得分:1)

这是一个简单的,替换:

echo $file;

在您的代码中

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

看到这个结果......

Found kbd in /etc
Found config in /etc/kbd
...

答案 2 :(得分: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附近使用双引号来避免在某些情况下出现错误扩展。