查找文件并仅打印其父目录

时间:2012-03-07 07:33:34

标签: linux shell command

我有以下命令。无论.user.log文件在哪里,我们都需要打印父目录(即hhtwee1。)如何做到这一点?

$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log

8 个答案:

答案 0 :(得分:15)

我在这里遗漏了什么。当然,所有这些正则表达式和/或循环都不是必需的,单行程将完成这项工作。当路径名中有空格时,“for foo in $()”解决方案也会失败。

只需使用dirname两次使用xargs,即可获得父级的父级...

# make test case
mkdir -p /nfs/office/hht/info
mkdir -p /nfs/office/wee1/info
touch /nfs/office/hht/info/.user.log
touch /nfs/office/wee1/info/.user.log

# parent's parent approach
cd /nfs//office/ && find . -name '.user.log' | xargs -I{} dirname {} | xargs -I{} dirname {}

# alternative, have find print parent directory, so dirname only needed once...
cd /nfs//office/ && find . -name ".user.log" -printf "%h\n"  | xargs -I{} dirname {}

可生产

./hht
./wee1

答案 1 :(得分:4)

您可以使用UiView的{​​{1}}操作的格式设置选项轻松完成此操作(请参阅-printf)。

find

来自man page

Screenshot of find manpage

man find将在新行上打印每个文件的路径。

请注意cd /nfs//office/ && find . -name '.user.log' -printf "%h\n" ./hht/info ./wee1/info 仅限GNU。它不会在macOS(BSD系统)上工作。

答案 2 :(得分:3)

for file in $(find /nfs/office -name .user.log -print)
do
    parent=$(dirname $(dirname $file))
    echo $parent
done

编辑:抱歉错过了你想要的祖父母目录。

答案 3 :(得分:1)

@trojanfoe有正确的想法; this只是一种使用任何文件名安全地工作的方法,几乎​​是循环中的任何命令:

while IFS= read -r -d '' -u 9
do
    echo "$(dirname -- "$(dirname -- "$REPLY")")"
done 9< <( find "/nfs/office/" -name '.user.log' -print0 )

如果您希望它仅回显唯一名称:

while IFS= read -r -d '' -u 9
do
    echo "$(dirname -- "$(dirname -- "$REPLY")")"
done 9< <( find "/nfs/office/" -name '.user.log' -print0 ) | sort -u

答案 4 :(得分:0)

find /nfs/office -name '.user.log' | while read line
do
    echo $line | awk -F/ '{print $(NF-1),$NF}'
done

答案 5 :(得分:0)

你可以这样做:

cd /nfs/office/ && find . -name '.user.log' | xargs -n1 -I{} expr match {} '\(\.\(\/[^/]*\/\)\?\)'

xargs使用expr match提取以.开头的部分,直到斜杠字符(/dir/)之间的目录第一次匹配。

使用sed的替代版本如下:

cd /nfs/office/ &&  find . -name 'file.txt' | sed -r 's|(\./([^/]*/)?).*|\1|'

答案 6 :(得分:0)

find -type f -exec bash -c 'echo "${1%/*}"' bash {} \;

答案 7 :(得分:0)

for i in $(find . -name ".user.log" -exec readlink -f {} \;)
do 
     parent=$(dirname $i)
     echo $parent
done

这可能会起作用并产生像

这样的输出

/nfs/office/hht/info

/nfs/office/wee1/info