![我正在解析 `ls` 的输出,但出了点问题](https://linux22.com/image/1100750/%E6%88%91%E6%AD%A3%E5%9C%A8%E8%A7%A3%E6%9E%90%20%60ls%60%20%E7%9A%84%E8%BE%93%E5%87%BA%EF%BC%8C%E4%BD%86%E5%87%BA%E4%BA%86%E7%82%B9%E9%97%AE%E9%A2%98.png)
我编写了这个简单的脚本,以递归方式将文件复制到多个子目录。这里我展示了 3 个子目录的问题。我的目录中有 3 个子目录和 2 个文件,如下所示
0.003/ 0.007/ 0.015/ program.cpp driver.sh*
我想program.cpp
使用下面显示的内容复制到所有这些子目录myscript.sh
:
#!/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}'
0.003
0.007
0.015
中只有三个值,i
那么它是如何产生四个输出的?无论如何,我已经通过附加条件解决了这个问题[ -d $mydir/$i ]
。但我的问题是脚本是如何产生第一行的cp -i driver.sh 32/
?
答案1
这说明了为什么你永远不应该依赖解析命令的输出ls
来迭代目录内容 - 而是使用简单的 shell glob,例如匹配以数字结尾的任何文件名
for f in $mydir/*[0-9]
do
if [ -e $mydir/$1 ]
.
.
done
至于它是如何生成行的cp -i driver.sh 32/
,您可以看到,当您在的输出中 grep 数字时ls -la
,它匹配该total: 32K
行以及所需的目录名称。
答案2
这说明了为什么你永远不应该依赖解析 ls 命令的输出来迭代目录内容 - 使用一个简单的find
命令:
find . -maxdepth 1 -type d --regex './[0-9]+$' -exec cp $1 {} \;