ls *.a
结果为
libpfnGen4.a libpfnNUKE.a
没有什么疑问,但是我在拷贝的时候
cp `ls *.a` ~/
却出现了无法找到目标的错误
然后,我看了一下,在当前目录下,确实没有“libpfnGen4.a libpfnNUKE.a”这两个文件(也不是隐藏文件,确认过了,就是不存在)
但是为什么“ls *.a”能显示呢,很是不解

代码: 全选
cp $(ls *.a) ~/
代码: 全选
ls |grep .a
代码: 全选
$ ls *.a
1.a 2.a
$ ls 0/
$ cp `ls *.a` 0
$ ls 0/
1.a 2.a
代码: 全选
cp *.a ~/
重做了实验,前面说的完全不对LS两位,这几个文件是从哪弄得呢?
我能想到的原因就是这三个文件你们没有写权限
测试一下刚才我试了一下,去除文件的写权限时,复制确实会导致这个错误,有读权限也白搭代码: 全选
[ -w FILE_NAME ] && echo write || echo oops
代码: 全选
Last_exit_code=0 2012年 05月 04日 星期五 22:39:31 CST hoxily@ubuntulucid:~/test$ ls -Rla
.:
total 24
drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 .
drwxr-xr-x 19 hoxily hoxily 4096 2012-05-04 19:48 ..
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:34 lib.a
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .macromedia
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .mozilla
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:39 trash
./lib.a:
total 8
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:34 .
drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 ..
-rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnGEN2.a
-rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnGEN4.a
-rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnNUKE.a
./.macromedia:
total 8
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .
drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 ..
./.mozilla:
total 8
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .
drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 ..
./trash:
total 8
drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:39 .
drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 ..
正解呀,牛Xhoxily 写了:我知道楼主的问题所在了。
楼主实际目录结构应该如下:关于'ls *a'和'ls -al | grep a$'为什么不一样的解释:代码: 全选
Last_exit_code=0 2012年 05月 04日 星期五 22:39:31 CST hoxily@ubuntulucid:~/test$ ls -Rla .: total 24 drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 . drwxr-xr-x 19 hoxily hoxily 4096 2012-05-04 19:48 .. drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:34 lib.a drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .macromedia drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 .mozilla drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:39 trash ./lib.a: total 8 drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:34 . drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 .. -rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnGEN2.a -rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnGEN4.a -rwxr-xr-x 1 hoxily hoxily 0 2012-05-04 19:49 libpfnNUKE.a ./.macromedia: total 8 drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 . drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 .. ./.mozilla: total 8 drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 19:50 . drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 .. ./trash: total 8 drwxr-xr-x 2 hoxily hoxily 4096 2012-05-04 22:39 . drwxr-xr-x 6 hoxily hoxily 4096 2012-05-04 22:34 ..
首先'ls *a'命令中的 * 符号在 bash 中有特殊含义,会被 bash 根据当前目录内容,优先扩展成 lib.a 。命令也就成了'ls lib.a', 意思就是查看当前目录下 lib.a 目录的文件目录列表。所以楼主看到了那三个 .a 文件。
关键在于 bash 对 *a 的扩展并不会包括 . 开头的文件或者目录。因此楼主用'ls *a'看不到那些以 . 开头的目录的列表信息,ls程序仅仅显示了 lib.a 目录的列表。
然后,对于'ls -al | grep a$'命令,它被 bash 忠实地执行,准确地传递了'-al'参数给 ls 命令,'a$'传给了 grep 命令。因此楼主成功的用grep命令筛选出了'ls -al'给出的当前目录下所有以a字符结尾的文件或者目录。
大概就是这样。大家一起来学Bash吧。
附我模拟的目录tar包。