我有一个目录(与子目录),其中我想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"