目标是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.c
和random.c
,则
find . -name *.c
变成:
find . -name hi.c random.c
包含*.c
在单引号中将导致 shell 不展开它。
要查找并处理.c
下的每个文件:~/csim
dos2unix
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
*.c
find
.c
-name
find . -name abc.c bcd.c
bcd.c
abc.c
-name
.c
.c
但是,当目录中没有文件时, *
in的实际含义*.c
将被保留。
因此,当您进入~/csim/exercise
并尝试使用find
search all时,我认为运行命令的目录中*.c
没有文件。这就是为什么保留in的通配符含义并且在子目录中搜索成功的原因。之后,搜索不成功,因为我怀疑有超过 1 个文件。*.c
find
*
*.c
cd ..
~/csim/
*.c
解决方案更简单,转义通配符就足够了。使用其中任何一种。
find . -name '*.c'
or
find . -name \*.c
or
find . -name "*.c"