如何检查文件是否完整并到达EOF?
How to check if a file have been complete and reach to EOF?
我的合作者正在处理一大批文件,但一些输出文件似乎在完成之前就被打断了。似乎这些不完整的文件没有文件结束符(EOF)。我想批量编写一个脚本来遍历所有这些文件,并检查 ~500 个文件中的每个文件是否都有 EOF 字符。你能告诉我如何做到这一点吗?我可以使用哪个命令来知道文件末尾是否有 EOF 字符?
我不确定文件完成后是否应该在文件末尾有一个特殊字符,但正常文件看起来像这样
my_user$ tail CHSA0011.fastq
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1106:6878:29640/2
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1202:14585:48098/1
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$
但是当我这样做时 tail
这些中断的文件看起来像:
my_user$ tail IST-MES1.fastq
@HS19_13305:3:1115:13001:3380/2
GTGGAGACGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCC
+
@B@FFFFFHHHHFHHIJJJJJIIJJJJJJJIJJJJGIIJJGIIGIIJJJJFDHHIJFHGIGHIHHHFFFFFFEEE
@HS19_13305:3:1106:5551:75750/2
CGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCCCCCCAAA
+
CCCFFADFHHHHHJJIJJJJJJJJJJJJEGGIJGGHIIJIIIIIIJJJJDEGGIJJJGIIIJJIJJJHHHFDDDD
@HS19_13305:3:2110:17731:73616/2
CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$
如您所见,在普通文件中 my_user$ 显示在文件末尾下方一行。但是在这些中断的文件中,my_user$ 紧挨着文件末尾。也许只是因为文件没有以换行符结尾 \n
?
如果问题有点混乱,我很抱歉,
干杯,
吉列尔莫
是的,不同之处在于,在第一种情况下,文件以 \n
(新行)结尾。
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$
在这种情况下,它没有换行符,所以它接下来打印的是你的使用(实际上是你的 PS1
)
CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$
你可以试试这个:
echo "CCCFFADFHHHHH" # <--- implicitly includes newline at the end
echo -n "CCCFFADFHHHHH" # <--- does not include newline at the end
实际上有两个endline选项,\r
和\n
,根据你的OS有不同的标准。我假设您正在处理 linux 并且只使用了 \n
。因此,在此示例中,换行符在 ascii 映射中为 0x0a
(数字 10)。
如果你想知道每个文件的最后一个字符,你可以这样做:
echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do
echo -n "$file ends with: 0x";
tail -c 1 $file | xxd -p;
done;
如果你想知道哪些文件以不是换行符的字符结尾,你可以这样做:
echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do
lastchar_hex=`tail -c 1 $file | xxd -p`
if [[ $lastchar_hex != '0a' ]]; then
echo "File $file does not end with newline"
fi;
done;
我的合作者正在处理一大批文件,但一些输出文件似乎在完成之前就被打断了。似乎这些不完整的文件没有文件结束符(EOF)。我想批量编写一个脚本来遍历所有这些文件,并检查 ~500 个文件中的每个文件是否都有 EOF 字符。你能告诉我如何做到这一点吗?我可以使用哪个命令来知道文件末尾是否有 EOF 字符?
我不确定文件完成后是否应该在文件末尾有一个特殊字符,但正常文件看起来像这样
my_user$ tail CHSA0011.fastq
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1106:6878:29640/2
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
@HS40_15367:8:1202:14585:48098/1
TGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGACCCTGAAGTAGGAACCAGA
+
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$
但是当我这样做时 tail
这些中断的文件看起来像:
my_user$ tail IST-MES1.fastq
@HS19_13305:3:1115:13001:3380/2
GTGGAGACGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCC
+
@B@FFFFFHHHHFHHIJJJJJIIJJJJJJJIJJJJGIIJJGIIGIIJJJJFDHHIJFHGIGHIHHHFFFFFFEEE
@HS19_13305:3:1106:5551:75750/2
CGAGGTTTCACCATGTTGGCCAGGCTGGTCTCGAGCTCCTGACCTCAAGTGATCCGTCTGCCTTGGCCCCCCAAA
+
CCCFFADFHHHHHJJIJJJJJJJJJJJJEGGIJGGHIIJIIIIIIJJJJDEGGIJJJGIIIJJIJJJHHHFDDDD
@HS19_13305:3:2110:17731:73616/2
CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$
如您所见,在普通文件中 my_user$ 显示在文件末尾下方一行。但是在这些中断的文件中,my_user$ 紧挨着文件末尾。也许只是因为文件没有以换行符结尾 \n
?
如果问题有点混乱,我很抱歉,
干杯, 吉列尔莫
是的,不同之处在于,在第一种情况下,文件以 \n
(新行)结尾。
BBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
my_user$
在这种情况下,它没有换行符,所以它接下来打印的是你的使用(实际上是你的 PS1
)
CGAGGTTTCACCATGTTGGCCAGGCTGmy_user$
你可以试试这个:
echo "CCCFFADFHHHHH" # <--- implicitly includes newline at the end
echo -n "CCCFFADFHHHHH" # <--- does not include newline at the end
实际上有两个endline选项,\r
和\n
,根据你的OS有不同的标准。我假设您正在处理 linux 并且只使用了 \n
。因此,在此示例中,换行符在 ascii 映射中为 0x0a
(数字 10)。
如果你想知道每个文件的最后一个字符,你可以这样做:
echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do
echo -n "$file ends with: 0x";
tail -c 1 $file | xxd -p;
done;
如果你想知道哪些文件以不是换行符的字符结尾,你可以这样做:
echo -n "CCCFFADFHHHHH" > uglyfile.txt
echo "CCCFFADFHHHHH" > nicefile.txt
for file in *.txt; do
lastchar_hex=`tail -c 1 $file | xxd -p`
if [[ $lastchar_hex != '0a' ]]; then
echo "File $file does not end with newline"
fi;
done;