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

时间:2017-01-31 18:58:30

标签: linux bash shell unix sh

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

我知道第一部分:

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

但是,如何在不使用“ipynb”扩展名的情况下获取名称? 任何回复都非常感谢...

9 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

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

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" "${@%.*}"' _ {} +

使用+ means我们将多个文件传递给每个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 ';'

答案 2 :(得分:3)

我在bash oneliner中发现了这一点,它简化了过程而无需使用find

for n in *.ipynb; do echo "${n%.ipynb}"; done

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

find . -type f -iname "*.ipynb" | grep -oP '.*(?=[.])'

-o标志仅输出匹配的部分。 -P标志根据Perl正则表达式进行匹配。这是使lookahead (?=[.])有效的必要条件。

答案 5 :(得分:0)

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

然后不是您的代码
你不想要的东西
find . | perl -a -F/ -lne 'print $F[-1] if !/.*.ipynb/g'

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

答案 6 :(得分:0)

如果在后缀之外的任何文件名上都没有出现此“.ipynb”字符串,那么您可以使用tr尝试这种更简单的方式:

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

答案 7 :(得分:0)

如果你不知道扩展名是否有多个,你可以使用它:

find . -type f -exec basename {} \;|perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'

以及没有重复项的文件列表(最初路径或扩展名不同)

find . -type f -exec basename {} \;|perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'|sort|uniq

答案 8 :(得分:0)

使用basename的另一种简便方法是:

find . -type f -iname '*.ipynb' -exec basename -s '.ipynb' {} +

使用+将减少命令(manpage)的调用次数:

-exec命令{} +

-exec操作的此变体在以下位置运行指定的命令 选定的文件,但是命令行是通过附加来构建的 每个选择的文件名末尾;总数 该命令的调用将远远少于数量 匹配文件。命令行的构建方式几乎相同 xargs构建其命令行的方式。只有一个 命令中允许使用“ {}”,并且(当正在查找时 从外壳调用),应将其引号(例如,“ {}”) 保护它免受炮弹的解释。该命令是 在起始目录中执行。如果有任何调用 “ +”形式返回非零值作为退出状态,然后 find返回非零退出状态。如果发现遇到 错误,有时可能会导致立即退出,因此有些 挂起的命令可能根本不会运行。因此,-exec my-command ... {} + -quit可能不会导致my-command 实际上正在运行。 -exec的此变体始终返回 是的。

-sbasename一起使用将接受多个文件名并删除指定的后缀(manpage):

-a,--multiple

支持多个参数,并将每个参数都视为一个名称

-s,--suffix = SUFFIX

删除结尾的SUFFIX;意味着-a