我是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'这个名字......
答案 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
附近使用双引号来避免在某些情况下出现错误扩展。