查找多个文件夹名称中的文件


44

我想列出所有从文件dir1dir2dir3dir4可能作为我的一个子目录在任何地方cwd使用的find命令。我尝试了以下操作,但均未成功:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

我也尝试posix-extended过。如何列出这些文件?


找 。-type f -regextype sed -regex“。* / dir [1-4] / [a-z0-9] *” ..到目前为止最短的答案:)参见下面的答案。unix.stackexchange.com
alpha_989

Answers:


59

如果要搜索名为foo,的三个文件夹barbaz对于所有*.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
harish.venkat

尽管dir仍需要位于cwd中,但它可能要低两个级别(例如./path/to/dir1),在这种情况下./dir1将不存在。
亚伦2013年

编辑了答案。
harish.venkat

8

最好使用-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
斯特凡Chazelas

4

只是让大家知道。.*/在每个dir解决方案之前都添加问题,因为regex似乎与完整路径匹配。


3

阅读之前的答案后,这是我的第一个主意:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

考虑到正则表达式必须与整个文件名匹配,并且更易于理解。


2

快速(!)在通配符(主目录)和一般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 '/)

2

如果您使用的是regextype,则无需按名称指定dir1到dir4

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f:查找文件而不是目录
  • regextype sed:使用sed regextype
  • regex:在整个路径中使用正则表达式进行搜索
  • ".*/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


(1)我们可能永远不会知道亚伦的确切情况或要求,但是其他答案却是谨慎的决定,他有四个目录,名称未指定。(他们可能是redgreenblueyellow,或者他们可能是JohnPaulGeorgeRingo。)你的回答假设他们是从字面上 dir1dir2dir3dir4。…(续)
斯科特,

(续)…(2)为什么您假设亚伦不想搜索子目录?他似乎在说他这样做。(3)为什么将搜索范围限制为仅包含小写字母和数字的文件(不包括foo_barfoo.txtFOO)?(4)/[^/]*当您的答案不使用时,为什么您的文字会解释?
斯科特(Scott)

斯科特,您好。
alpha_989

(1-3)。他提到“我正在尝试列出dir1,dir2,dir3和dir4中的所有文件 ”,这些文件可能位于cwd的子目录中,这意味着dir1-dir4可能位于任何位置,但是他想找到正确的文件在dir1-dir4中。当然,如果不是dir1-dir4,则必须使用red \ | blue \ | green \ |将其更改为特定名称。等
alpha_989

4.那里的错字..我以前使用[a-z0-9] * ..然后意识到[^ /] *较短且更具包容性..我在发布时忘了更改它。感谢您的细心评论。
alpha_989

0

我知道您已指定使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.