如何查找包含16行的文件?

时间:2013-06-17 12:32:21

标签: bash awk grep

我必须在Bash中找到包含16行的文件。

我的想法是:

find -type f | grep '/^...$/'

有谁知道如何使用find + grepfind + awk

然后,

  • 将匹配文件移动到另一个目录。
  • 删除所有不匹配的文件。

7 个答案:

答案 0 :(得分:6)

我会这样做:

wc -l **/* 2>/dev/null | awk '$1=="16"'

答案 1 :(得分:5)

保持简单:

find . -type f |
while IFS= read -r file
do
    size=$(wc -l < "$file")
    if (( size == 16 ))
    then
        mv -- "$file" /wherever/you/like
    else
        rm -f -- "$file"
    fi
done

如果你的文件名可以包含换行符,那么请谷歌查找处理该文件的查找和阅读选项。

答案 2 :(得分:2)

您应该使用grep代替wc,因为wc会计算换行符\n,如果最后一行不以换行符结束,则不会计算。

e.g。

grep -cH '' * 2>/dev/null | awk -F: '$2==16'

更正确的方法(没有错误消息,没有参数列表太长错误)你应该将它与findxargs命令结合起来,比如

find . -type f -print0 | xargs -0 grep -cH '' | awk -F: '$2==16'

如果您想要计算空行(因此只包含至少包含一个字符的行),您可以将''替换为'.'。而不是awk,你可以使用第二个grep,如:

find . -type f -print0 | xargs -0 grep -cH '.' | grep ':16$'

这将找到包含16个非空行的所有文件......等等..

答案 3 :(得分:1)

GNU sed

sed -E '/^.{16}$/!d' file

答案 4 :(得分:0)

版本:

#!/usr/bin/bash

for f in *; do # Look for files in the present dir
  [ ! -f "$f" ] && continue # Skip not simple files
  cnt=0
  # Count the first 17 lines
  while ((cnt<17)) && read x; do ((++cnt)); done<"$f"
  if [ $cnt == 16 ] ; then echo "Move '$f'"
  else echo "Delete '$f'"
  fi
done

答案 5 :(得分:0)

我会选择

find . -type f | while read f ; do
  [[ "${f##*/}" =~ ^.{16}$ ]] && mv "${f}" <any_directory>  || rm -f "${f}"
done

find . -type f | while read f ; do
  [[ $(echo -n "${f##*/}" | wc -c) -eq 16 ]] && mv "${f}" <any_directory>  || rm -f "${f}"
done

<any_directory>替换为您实际要将文件移动到的目录。

BTW,find命令将转到子目录。如果你不想这样,那么你应该改变find命令以满足你的需要。

答案 6 :(得分:0)

此代码段将完成工作:

find . -type f -readable -exec bash -c \
    'if(( $(grep -m 17 -c "" "$0")==16 )); then echo "file $0 has 16 lines"; else echo "file $0 doesn'"'"'t have 16 lines"; fi' {} \;

因此,如果您需要删除长度不超过16行的文件,并将16行长的文件移至文件夹/my/folder,则会执行以下操作:

find . -type f -readable -exec bash -c \
    'if(( $(grep -m 17 -c "" "$0")==16 )); then mv -nv "$0" /my/folder; else rm -v "$0"; fi' {} \;

观察"$0"的引用,以确保其中包含有趣符号的任何文件名(空格,......)是安全的。

我正在使用-v选项,以便rmmv详细(我想知道发生了什么)。 -n的{​​{1}}选项是no-clobber:不覆盖现有文件的安全性;如果您有旧系统,则此选项可能不可用。

关于这种方法的好处。对于任何包含有趣符号的文件名,这是非常安全的。

不好的事情。它会为找到的每个文件分配mvbash以及grepmv。这可能很慢。这可以使用更棘手的东西来修复(同时对于文件名中的有趣符号仍然保持安全)。如果你真的需要它,我可以给你一个可能的答案。如果文件无法(重新)移动,它也会中断。

备注。我正在使用rm -readable选项,因此它只考虑可读的文件。如果您有此选项,请使用它,您将拥有更强大的命令!