从 bash 中没有点扩展名的文件中删除行

remove lines from file that does not have dot extension in bash

我有这样的文件,其中包含如下行:

/folder/share/folder1
/folder/share/folder1/file.gz
/folder/share/folder2/11072012
/folder/share/folder2/11072012/file1.rar

我正在尝试删除这些行:

/folder/share/folder1/
/folder/share/folder2/11072012

要获得以下最终结果:

/folder/share/folder2/11072012/file1.rar
/folder/share/folder1/file.gz

换句话说,我试图只保留文件而不是目录的路径。

您可以使用 find 命令仅获取文件列表

find <directory> -type f

这个

awk -F/ '$NF~/\./{print}'
  • 使用命令行开关 -F
  • 在字符“/”上拆分输入记录
  • 检查输入记录的最后一个字段 $NF(其中 NF 是输入记录中的字段数)以查看它是否包含字符“.” (!~ 运算符)
  • 如果匹配,输出记录。

示例

$ echo -e '/folder/share/folder.2/11072012
/folder/share/folder2/11072012/file1.rar' | mawk -F/ '$NF~/\./{print}'
/folder/share/folder2/11072012/file1.rar
$

注意:我的 microscript 仅在完整路径的文件名部分查看 .

编辑 在我的第一个 post 中我颠倒了逻辑,打印无点文件而不是点文件。

使用 awk:

awk -F/ '$NF ~ /\./{print}' File

设置/作为分隔符,检查最后一个字段($NF)是否有.,如果有,打印该行。

纯文本结果

sed -n 'H
$ {g
:cycle
   s/\(\(\n\).*\)\(\(.*\)\{0,1\}\)//g
   t cycle
   s/^\n//p
   }' YourFile
  • 基于文件名和文件夹名假设:

    • 其他行里面的行是文件夹,uniq是文件(可以通过结果上的OS文件存在文件来完成)
    • 行已排序(至少在文件夹和文件之间)
  • posix 版本 --posixGNU sed