我有以下命令。无论.user.log
文件在哪里,我们都需要打印父目录(即hht
和wee1
。)如何做到这一点?
$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log
答案 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:
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