我已经在线检查了一些答案,但是当命令中有参数时它们不起作用-name
(也许我做错了什么,不确定)。我想做的是仅列出文件名(而不是目录/路径),更复杂的是,我有相同的文件名但具有不同的扩展名,所以我需要使用-name
和 来过滤结果-o
,问题是我的建议看到使用 或-printf
,basename
并且当存在时这些效果不佳-name *.txt -o name *.pdf
。还有其他方法可以解决这个问题吗?
我的文件示例:
\n/dir1/dir2/dir3/dir4/\n /file1.txt\n /file1.pdf\n /file1.ods ...etc.\n
Run Code Online (Sandbox Code Playgroud)\n我只对每个列表列出一种或多种类型的文件感兴趣(通过使用-name
来过滤我的结果。
是否可以仅使用 1 个find
命令来完成它,或者我必须分两步完成(将结果保存在临时文件中,然后从临时文件中过滤/删除目录)?我试图完成的结果是一个文本文件,每行都有文件名:
file1.txt\nfile1.pdf\nfile1.ods\nfile2.txt\nfile2.pdf\netc.\n
Run Code Online (Sandbox Code Playgroud)\n我使用的命令是
\nfind /dir1/dir2/dir3/dir4/ -type f -name '*.txt' -o -name '*.pdf' -o -name '*.ods' -printf "%f\\n"\n
Run Code Online (Sandbox Code Playgroud)\n我正在使用 GNU 查找。
\n更新
\n事实证明我必须把\\(...\\)
,正如 \xce\xb1\xd2\x93s\xd0\xbd\xce\xb9\xce\xb7 提醒的那样
当以逻辑 OR 模式使用多个表达式时,-o
您需要将它们全部括在 内\( ... \)
,否则始终尊重最后一个表达式结果;并-printf '%f\n'
用于仅打印删除了所有前导目录的文件名。
find . -type f \( -name '*.pdf' -o -name '*.txt' \) -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)
请参见“操作员”man find
部分:( expr )
运营商
...(expr)
强制优先。由于括号对于 shell 来说是特殊的,因此通常需要用引号引起来。
因此您可以使用\( ... \)
or '(' ... ')'
(括号前后的空格很重要)来转义它们。