File too large problem.

When I try to transfer the huge STRING PPI data file (30.1GB text
file), there was always a problem, indicating this error, “Error
splicing file: File too large”
The problem is  my hard drive was formatted in FAT32 format. The max
file size for FAT32 is 4GB. The max file size for FAT16 is only 2GB!
To solve this problem there are many ways.
(1) Use grep to specifically retrieve the information you may wish to
use, as I deed, greb . 9606 …
(2) split the huge files into several pieces. On linux use split
(3) Format FAT32 into NTFS

FAT (File Allocation Table, 16-bit) FAT is used for all drives under
512 MB, such as flash memory cards and floppy disks. The largest drive
supported by the FAT filesystem is 2 GB.

FAT32 (File Allocation Table, 32-bit) Designed to overcome the 2 GB
partition limit with the FAT system, FAT32 is supported by every
version of Windows since Windows 95 OSR2. Today, it’s used mostly for
flash memory cards larger than 2 GB, and on older PCs running Windows
98 and Windows Me.

In addition to the support for larger drives, it also supports smaller
file clusters, so it stores information more efficiently than FAT.
Read my previous post on how to format an external hard drive in
FAT32.

NTFS (NT Filesystem) NTFS, designed from the ground up to completely
replace FAT/FAT32, is the default filesystem on all Vista PCs.
(Specifically, Vista supports NTFS version 3.1.)

It offers security features like encryption and permissions,
compression, and quotas. It’s typically faster and more reliable than
FAT/FAT32, and supports drives up to 2 terabytes in size

Bash的输入输出重定向

使用Bash可以方便的用<>实现输出输入的重定向,本文讨论重定向的一些细节和技巧。本文介绍部分是对Bash Quick Reference相关内容的翻译。

基础知识

文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。常用的文件描述符如下:

文件描述符 名称 常用缩写 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕

我们在简单地用<>时,相当于使用 0< 1>(下面会详细介绍)。

管道“|”(pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;

tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;

简单重定向

  • cmd > file

cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bashnoclobber选项可以防止覆盖原有文件。
  • cmd >> file

cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。
  • cmd < file

使cmd命令从file读入
  • cmd << text

从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。
  • cmd <<< word

word(而不是文件word)和后面的换行作为输入提供给cmd
  • cmd <> file

以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。
  • cmd >| file

功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。

使用文件描述符的重定向

使用文件描述符的重定向都使用了&符号。

cmd >&n 把输出送到文件描述符n
cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n
cmd >&- 关闭标准输出
cmd <&n 输入来自文件描述符n
cmd m<&n m来自文件描述各个n
cmd <&- 关闭标准输入
cmd <&n- 移动输入文件描述符n而非复制它。(需要解释)
cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释)

注意: 
>&
实际上复制了文件描述符,这使得ls > dirlist 2>&1ls 2>&1 > dirlist的效果不一样。man bashRedirection节中提及了这段内容。

重定向的组合应用

cmd 2>file 把文件描述符2重定向到file,即把错误输出存到file中。
cmd > file 2>&1 把标准错误重定向到标准输出,再重定向到file,即stderrstdout都被输出到file
cmd &> file 功能与上一个相同,更为简便的写法。
cmd >& file 功能仍与上一个相同。
cmd > f1 2>f2 stdout重定向到f1,而把stderr重定向到f2
tee files stdout原样输出的同时,复制一份到files中。
tee files stderrstdout都输出到files中,同时输出到屏幕。

重定向实例

Template:Bash重定向实例

类似重定向的功能

下面的一些用法并不属于重定向的范畴,但和重定向较为类似。

进程替换

bash在某些系统中的特性,可以将输入输出转到另一个程序中去,可以同时输出个多个程序,使用方法是>(list)<(list),如[1]

wget -O - http://example.com/dvd.iso \
 | tee >(sha1sum > dvd.sha1) \
 >(md5sum > dvd.md5) \
 > dvd.iso

巧妙地同时完全了SHA-1MD5校验工作。

总结一下,正则表达式需要转义的特殊字符

  •  $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,那么 $ 还匹配 \n 或 \r 前面的位置。若要匹配 $ 字符本身,请使用 \$。
  • ( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。若要匹配这两个字符,请使用 \( 和 \)。
  • * 零次或多次匹配前面的字符或子表达式。若要匹配 * 字符,请使用 \*。
  • + 一次或多次匹配前面的字符或子表达式。若要匹配 + 字符,请使用 \+。
  • . 匹配除换行符 \n 之外的任何单个字符。若要匹配 .,请使用 \。 [ ] 标记中括号表达式的开始。若要匹配这些字符,请使用 \[ 和 \]。
  • ? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。若要匹配 ? 字符,请使用 \?。
  • \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,字符 n 匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \,序列 \( 匹配 (。
  • / 表示文本正则表达式的开始或结束。若要匹配 / 字符,请使用 \/。
  • ^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。若要匹配 ^ 字符本身,请使用 \^。
  • { } 标记限定符表达式的开始。若要匹配这些字符,请使用 \{ 和 \}。
  • | 指出在两个项之间进行选择。若要匹配 | ,请使用 \|