我有一个目录(带子目录),我希望找到所有扩展名为“.ipynb”的文件。但我希望'find'命令只返回这些没有扩展名的文件名。
我知道第一部分:
find . -type f -iname "*.ipynb" -print
但是,如何在不使用“ipynb”扩展名的情况下获取名称? 任何回复都非常感谢...
答案 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的此变体始终返回 是的。
将-s
与basename
一起使用将接受多个文件名并删除指定的后缀(manpage):
-a,--multiple
支持多个参数,并将每个参数都视为一个名称
-s,--suffix = SUFFIX
删除结尾的SUFFIX;意味着-a