我必须在Bash中找到包含16行的文件。
我的想法是:
find -type f | grep '/^...$/'
有谁知道如何使用find
+ grep
或find
+ awk
?
然后,
答案 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'
更正确的方法(没有错误消息,没有参数列表太长错误)你应该将它与find
和xargs
命令结合起来,比如
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)
sed -E '/^.{16}$/!d' file
答案 4 :(得分:0)
纯bash版本:
#!/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>
替换为您实际要将文件移动到的目录。
答案 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
选项,以便rm
和mv
详细(我想知道发生了什么)。 -n
的{{1}}选项是no-clobber:不覆盖现有文件的安全性;如果您有旧系统,则此选项可能不可用。
关于这种方法的好处。对于任何包含有趣符号的文件名,这是非常安全的。
不好的事情。它会为找到的每个文件分配mv
和bash
以及grep
或mv
。这可能很慢。这可以使用更棘手的东西来修复(同时对于文件名中的有趣符号仍然保持安全)。如果你真的需要它,我可以给你一个可能的答案。如果文件无法(重新)移动,它也会中断。
备注。我正在使用rm
-readable
选项,因此它只考虑可读的文件。如果您有此选项,请使用它,您将拥有更强大的命令!