递归查找*.c文件进行dos2unix处理

递归查找*.c文件进行dos2unix处理

目标是find *.c 文件待处理dos2unix

find . -name *.c | xargs dos2unix -f

尝试对上述命令进行故障排除:

user@host:~/csim/exercise$ find . -name *.c
./6-1/dinph_3p.c
./6-1/dinph_pi.c
./9-2/lift.c
./6-4/cmptr.c
./8-7/station.c
./7-4/hire.c
./5-2/ran_test.c
./8-4/cmptrm.c
./9-5/trunked.c
./8-5/computer.c
./9-3/aloha.c
./12-3/mcpu.c
./10-5/abp_pi.c
./6-2/dinph_3p.c
./6-2/dinph_pi.c

为什么BASH上移一级目录时会出现这样的情况:

$ cd ..

相同的命令至少不返回上面列出的 .c 文件?

user@host:~/csim$ find . -name *.c
find: paths must precede expression: random.c
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec|time] [path...] [expression]

答案1

当您搜索通配符(例如,*.c)时,您确实应该将其包含在单引号中。当您向上移动一个目录时,我的猜测是您输入的目录中至少有两个以 结尾的文件.c,其中一个是random.c.在这种情况下,bash 会扩展*.c到匹配的文件。

假设该目录包含hi.crandom.c,则

find . -name *.c

变成:

find . -name hi.c random.c

包含*.c在单引号中将导致 shell 不展开它。

要查找并处理.c下的每个文件:~/csimdos2unix

find ~/csim -type f -name '*.c' | xargs dos2unix -f

答案2

为@Andy 的内容添加更多解释。

基本上find命令需要一个文件名或模式,作为选项的参数(占位符)-name

当您尝试echo *.c在包含一个或多个文件的目录中运行.c, 结果将是这些文件的以空格分隔的名称,例如

$echo *.c
abc.c bcd.c

.c如果目录中没有文件,则结果必须是

$echo *.c
*.c

同样,在具有超过 1 个文件find . -name *.c的目录中, in被该目录中存在的所有文件的名称替换(*.c 被扩展为选项的多个参数)。那一定是这样的,。这里,当 find成功搜索后 开始搜索时,会出现错误,因为只接受一个参数。(如果只有 1 个参数,则将其写入结果,不再在子目录中进行搜索).c*.cfind.c-namefind . -name abc.c bcd.cbcd.cabc.c-name.c

.c但是,当目录中没有文件时, *in的实际含义*.c将被保留。

因此,当您进入~/csim/exercise并尝试使用findsearch all时,我认为运行命令的目录中*.c没有文件。这就是为什么保留in的通配符含义并且在子目录中搜索成功的原因。之后,搜索不成功,因为我怀疑有超过 1 个文件。*.cfind**.ccd ..~/csim/*.c

解决方案更简单,转义通配符就足够了。使用其中任何一种。

find .  -name '*.c'
or
find .  -name \*.c
or
find .  -name "*.c"

相关内容