for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-`
do
cd $i
ls
cd ../
done
在上面的例子中,我期待脚本进入每个目录,填充该目录的所有文件,从它出来,然后进入其他目录并打印它的内容。请在这里建议最新的错误。Shell脚本没有给出正确的输出
for i in `ls -lrt|grep ^d|cut -d ' ' -f 13-`
do
cd $i
ls
cd ../
done
在上面的例子中,我期待脚本进入每个目录,填充该目录的所有文件,从它出来,然后进入其他目录并打印它的内容。请在这里建议最新的错误。Shell脚本没有给出正确的输出
执行以下操作之一是否在执行您正在查找的任务?
ls *
ls * -r
因为有可变数目的每个场之间的空间在Ls -ltr输出,由于LS格式化和可变长度的文本字段的反复无常cut命令不能正常工作。解析文件名了LS目录列表的更可靠的方法是替换AWK剪切命令“{打印$ 9}”,所以for循环应该是这样的:
for i in `ls -lrt|grep ^d| awk '{print $9}'`
awk是这样的事情最好.. – doniyor
请检查字段13是所需字段,它是ls命令输出的最后一个字段。在我的系统中,它是第九个领域。所以通过我将您的代码更改为,
for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
do
echo "Directory -$i"
cd $i
ls
cd ../
done
它在此更改后正常工作。
你也可以使用其他命令来执行它,比如sed,awk。我用awk做了它,但不是硬编码的任何字段值(使用内部变量NF - 字段数,以获取最后一个字段,它应该是目录的名称)。
#for i in `ls -lrt|grep ^d|cut -d ' ' -f9`
for i in `ls -lrt|grep ^d|awk '{print $NF}'`
do
echo "Directory -$i"
cd $i
ls
cd ../
done
这也工作得很好。
绝对不要对“ls
中的文件”做任何变化,因为它的名称中包含空格的文件将失败。所有你需要的是:
find . -print
,如果你想要做的事,在当前目录下的每个文件,那么它只是
for file in *
do
printf "Working on %s\n" "$file"
<do stuff with "$file">
done
或所有子目录太然后使用xargs的还是:
find . -print |
while IFS= read -r file
do
printf "Working on %s\n" "$file"
<do stuff with "$file">
done
虽然后者与任何基于管道的解决方案一样,将会因其名称中带有换行符的文件而失败。
遍历只在当前目录下的目录,使用该模式*/
,所以
for dir in */; do
cd "$dir"
do stuff
cd ..
done
为什么不只是'为F *;如果[-d“$ f”];那么ls“$ f”;网络连接;完成' – Amber
你看到的输出是什么?在循环中添加echo $ i,并检查ls命令是否正确。 – SidJ
它进入一个目录我猜第一个,然后它无法进入其他目录和输出说ca'nt cd到(目录名称) – Kunal