我正在解析`ls`的输出,出了点问题

我制作了这个简单的脚本,以递归方式将文件复制到许多子目录中。 这里我展示了3个子目录的问题。 我在目录中有3个子目录和2个文件,如下所示

0.003/ 0.007/ 0.015/ program.cpp driver.sh* 

我想使用下面显示的myscript.shprogram.cpp复制到所有这些子目录:

  #!/bin/bash mydir=`pwd` for i in `ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'` do if [ -e $mydir/$1 ] then echo "cp -i $1 $i/" else echo "File \"$1\" not found in current directory" fi done 

我把cp放在echo里面来测试代码。 输出很奇怪,

 cp -i program.cpp 32/ cp -i program.cpp 0.003/ cp -i program.cpp 0.007/ cp -i program.cpp 0.015/ 

ls -la的输出

 total 32K drwxr-xr-x. 5 gulu workg 4.0K Nov 29 2013 . drwxr-xr-x. 7 gulu workg 4.0K Nov 29 2013 .. drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.003 drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.007 drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.015 -rw-r--r--. 1 gulu workg 4.2K Nov 29 2013 program.cpp -rwxr-xr-x. 1 gulu workg 982 Nov 26 08:22 driver.sh 

ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'的输出 ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'

 0.003 0.007 0.015 

i中只有三个值,那么它如何产生四个输出? 无论如何,我已经解决了附加条件[ -d $mydir/$i ] 。 但我的问题是脚本如何生成第一行cp -i driver.sh 32/

这说明了为什么你不应该依赖于解析ls命令的输出来迭代目录内容 – 使用简单的shell glob代替例如匹配以数字结尾的任何文件名

 for f in $mydir/*[0-9] do if [ -e $mydir/$1 ] . . done 

至于如何生成行cp -i driver.sh 32/ ,你可以看到当你在ls -la的输出中grep数字时,它匹配total: 32K行以及想要的目录名。

这说明了为什么你不应该依赖于解析ls命令的输出来迭代目录内容 – 使用一个简单的find命令:

 find . -maxdepth 1 -type d --regex './[0-9]+$' -exec cp $1 {} \;