我想列出所有从文件dir1
,dir2
,dir3
并dir4
可能作为我的一个子目录在任何地方cwd
使用的find
命令。我尝试了以下操作,但均未成功:
find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'
我也尝试posix-extended
过。如何列出这些文件?
我想列出所有从文件dir1
,dir2
,dir3
并dir4
可能作为我的一个子目录在任何地方cwd
使用的find
命令。我尝试了以下操作,但均未成功:
find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'
我也尝试posix-extended
过。如何列出这些文件?
Answers:
如果要搜索名为foo
,的三个文件夹bar
,baz
对于所有*.py
文件,请使用以下命令:
find foo bar baz -name "*.py"
因此,如果您要显示dir1
dir2
dir3
使用中的文件find dir1 dir2 dir3 -type f
尝试这个 find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;
./dir
代替dir
./path/to/dir1
),在这种情况下./dir1
将不存在。
最好使用-path指令:
find . \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)
这意味着:查找当前目录中路径中有“ dir1”或“ dir2”或“ dir3”或“ dir4”的所有文件。
-a
和-o
有关GNU -and
/ 的标准等效内容-or
。
快速(!)在通配符(主目录)和一般apache2日志目录定义的多个位置中查找特定文件(access_log)的示例,还应用名称过滤以排除ssl日志和gzip压缩的旧日志。此处不会直接回答问题,但可能对发现这些说明的人很有用(例如我)。
find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f -name "*access_log" ! -name "*ssl*"
注意空格,特别是靠近\(
和\)
。
顺便说一下,我将其用于apachetop,以在服务器中找到最活跃的网站。
apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)
如果您使用的是regextype,则无需按名称指定dir1到dir4
find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
type f
:查找文件而不是目录regextype sed
:使用sed regextyperegex
:在整个路径中使用正则表达式进行搜索".*/dir[1-4]/[a-z0-9]*"
:开头的。*表示可以是任何类型的字符(char / number /反斜杠(/)等);dir [1-4]表示查找“ dir”,后跟1到4之间的数字;/ [^ /] *指出,在dir1-4之后的路径名省略了其中包含/的所有路径名,因此它仅返回目录dir1-dir4中的文件,而忽略了可能在dir1-dir4中的任何子目录。创建了一个目录供您测试:https : //github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017
red
,green
,blue
和yellow
,或者他们可能是John
,Paul
,George
和Ringo
。)你的回答假设他们是从字面上 dir1
,dir2
,dir3
和dir4
。…(续)
foo_bar
,foo.txt
和FOO
)?(4)/[^/]*
当您的答案不使用时,为什么您的文字会解释?
我知道您已指定使用find,但是仅为了显示可以使用的其他选项,您可以使用xargs:
find . -type d | grep -E "dir1$|dir2$" | xargs ls
find . -name "dir1" -or -name "dir2" | xargs ls
您可以拥有一个名为“ folders”的文件,其中包含以下内容:
$ cat folders
dir1
dir2
dir3
dir4
然后,您可以执行以下操作:
$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1 file2 file3 file4
./Documents/dir2:
file1 file2 file3 file4
./Documents/dir3:
file1 file2 file3 file4
./Documents/dir4:
file1 file2 file3 file4
我认为xargs比find -exec更灵活。你也可以做一些疯狂的事情
$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1 file2 file3 file4
/home/user/Documents/dir2:
file1 file2 file3 file4
/home/user/Documents/dir3:
file1 file2 file3 file4