使用"find"返回没有扩展名的文件名

Sia*_*ian 11 unix linux bash shell sh

我有一个目录(带子目录),我想找到所有扩展名为".ipynb"的文件.但我希望'find'命令只返回这些没有扩展名的文件名.

我知道第一部分:

find . -type f -iname "*.ipynb" -print    
Run Code Online (Sandbox Code Playgroud)

但是,如何在没有"ipynb"扩展名的情况下获取名称?任何回复都非常感谢...

ken*_*orb 10

要仅返回没有扩展名的文件名,请尝试:

find . -name "*.ipynb" -execdir sh -c 'printf "%s\n" "${0%.*}"' {} ';'
Run Code Online (Sandbox Code Playgroud)

要么:

find "$PWD" -type f -iname "*.ipynb" -execdir basename {} .ipynb ';'
Run Code Online (Sandbox Code Playgroud)

要么:

find . -type f -iname "*.ipynb" -exec basename {} .ipynb ';'
Run Code Online (Sandbox Code Playgroud)

然而,调用basename每个文件可能效率低下,所以@CharlesDuffy建议是:

find . -name '*.ipynb' -exec bash -c 'printf "%s\n" "${@%.*}"' _ {} +
Run Code Online (Sandbox Code Playgroud)

使用+意味着我们将多个文件传递给每个bash实例,因此如果整个列表适合单个命令行,我们只调用bash一次.


要在同一行中打印完整路径和文件名(不带扩展名),请尝试:

find . -name "*.ipynb" -exec sh -c 'printf "%s\n" "${0%.*}"' {} ';'
Run Code Online (Sandbox Code Playgroud)

要么:

find "$PWD" -type f -iname "*.ipynb" -print | grep -o "[^\.]\+"
Run Code Online (Sandbox Code Playgroud)

要在单独的行上打印完整路径和文件名:

find "$PWD" -type f -iname "*.ipynb" -exec dirname "{}" ';' -exec basename "{}" .ipynb ';'
Run Code Online (Sandbox Code Playgroud)


eew*_*nco 8

这是一个简单的解决方案:

find . -type f -iname "*.ipynb" | sed 's/\.ipynb$//1'
Run Code Online (Sandbox Code Playgroud)

  • 我使用这个是因为它不会为每个文件创建像 bash 或 basename 这样的进程。有点定制,但速度更快。 (2认同)

jji*_*now 5

我在 bash oneliner 中发现了这个,它简化了过程而不使用 find

for n in *.ipynb; do echo "${n%.ipynb}"; done
Run Code Online (Sandbox Code Playgroud)

  • 仅当文件位于当前目录中时这才有效。OP的原始代码可以在子目录中查找文件。 (2认同)