使用“查找”返回没有扩展名的文件名

我有一个目录(与子目录),其中我想find所有具有“.ipynb”扩展名的文件。 但是我想“find”命令只是把这些文件名返回给我,没有扩展名。

我知道第一部分:

find . -type f -iname "*.ipynb" -print 

但是,我怎样才能得到没有“ipynb”扩展的名字? 任何答复非常感谢…

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

 find . -name "*.ipynb" -execdir sh -c 'printf "%s\n" "${0%.*}"' {} ';' 

要么:

 find "$PWD" -type f -iname "*.ipynb" -execdir basename {} .ipynb ';' 

要么:

 find . -type f -iname "*.ipynb" -exec basename {} .ipynb ';' 

但是在每个文件上调用basename可能是低效的,所以@CharlesDuffy的建议是:

 find . -name '*.ipynb' -exec bash -c 'printf "%s\n" "${@%.*}"' _ {} + 

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


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

 find . -name "*.ipynb" -exec sh -c 'printf "%s\n" "${0%.*}"' {} ';' 

要么:

 find "$PWD" -type f -iname "*.ipynb" -print | grep -o "[^\.]\+" 

在不同的行上打印完整路径和文件名:

 find "$PWD" -type f -iname "*.ipynb" -exec dirname "{}" ';' -exec basename "{}" .ipynb ';' 

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

 find . -type f -iname "*.ipynb" | sed 's/\.ipynb$//1' 

如果您需要目录名称但没有扩展名:

 find . -type f -iname "*.ipynb" -exec sh -c 'f=$(basename $1 .ipynb);d=$(dirname $1);echo "$d/$f"' sh {} \; 
 find . -type f -iname "*.ipynb" | grep -oP '.*(?=[.])' 

-o标志只输出匹配的部分。 -P标志根据Perl正则表达式匹配。 这是使前瞻 (?=[.])工作的必要条件。

Perl一个班轮
你想要什么
find . | perl -a -F/ -lne 'print $F[-1] if /.*.ipynb/g'

那么不是你的代码
你不想要什么
find . | perl -a -F/ -lne 'print $F[-1] if !/.*.ipynb/g'

注意
Perl中,你需要额外的. 。 所以你的模式是.*.ipynb

如果在除了后缀以外的任何文件名上没有出现这个“.ipynb”字符串,那么你可以试试这个更简单的方法,使用tr

 find . -type f -iname "*.ipynb" -print | tr -d ".ipbyn"