我有以下命令。无论在哪里存在.user.log
文件,我们都需要打印父目录(即hht
和wee1
)。这怎么办?查找文件并仅打印其父目录
$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log
我有以下命令。无论在哪里存在.user.log
文件,我们都需要打印父目录(即hht
和wee1
)。这怎么办?查找文件并仅打印其父目录
$ cd /nfs//office/ && find . -name '.user.log'
./hht/info/.user.log
./wee1/info/.user.log
我在这里错过了什么。当然,所有这些正则表达式和/或循环都是不必要的,一行代码就可以完成这项工作。如果路径名中有空格,“for $()”中的foo解决方案将失败。
只要使用目录名称两次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
for file in $(find /nfs/office -name .user.log -print)
do
parent=$(dirname $(dirname $file))
echo $parent
done
编辑:对不起错过了你想要的祖父母目录。
find /nfs/office -name '.user.log' | while read line
do
echo $line | awk -F/ '{print $(NF-1),$NF}'
done
你可以做这样的事情:
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|'
@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
您使用不同文件描述符的任何特定原因? – 2012-03-07 11:31:25
如果你想在循环内用stdin做一些事情。它在上面的链接中解释。 – l0b0 2012-03-07 14:00:40
您可以用find
的-printf
行动的格式选项做到这一点很容易(见man find
)。
cd /nfs//office/ && find . -name '.user.log' -printf "%h\n"
./hht/info
./wee1/info
从man page:
%h\n
将打印在新行的每个文件的路径。
请注意,-printf
是GNU专用的。它不适用于macOS(一个BSD系统)。
find -type f -exec bash -c 'echo "${1%/*}"' bash {} \;
我可以做,找到结果目录查找的permsissions。 -name'.user_repo。日志'| xargs -i {} dirname {} | xargs -i {} dirname {} | xargs ll – Rajeev 2012-03-07 09:13:03
假设你所指的是“ls -lA”的常用别名,那么没有。 xargs将只运行命令,而不是别名。但是,您可以改为“xargs ls -lA”... – Adam 2012-03-07 10:06:22
请注意,'xargs'的'-i'标志被列为已弃用,最好使用'-I'标志。 – 2014-05-12 20:00:52