我想循环遍历: ls -l /some/dir/*的输出中的每一行
ls -l /some/dir/*
现在我正在尝试: for x in $(ls -l $1); do echo $x; done
for x in $(ls -l $1); do echo $x; done
但是,这会分别迭代该行中的每个元素,因此我得到:
-r--r----- 1 ivanevf eng 1074 Apr 22 13:07 File1 -r--r----- 1 ivanevf eng 1074 Apr 22 13:17 File2
但是,我想将每一行作为一个整体进行迭代。我该如何做呢?
这取决于您想对每一行做什么。Awk 对于这种类型的处理是一个有用的实用程序。例如:
ls -l | awk '{print $9, $5}'
. . 在我的系统打印的名称和大小的每个项目在目录中。
Read (1)实用程序以及 ls (1)命令的输出重定向将完成您想要的操作。
如前所述,awk 是解决这个问题的正确工具。如果您不想使用 awk,而不是逐行解析“ ls-l”的输出,您可以迭代所有文件,并为每个单独的文件执行“ ls-l”命令,如下所示:
for x in * ; do echo `ls -ld $x` ; done
将 IFS 设置为换行,如下所示:
IFS=' ' for x in `ls -l $1`; do echo $x; done
如果你不想永久设置 IFS,可以在它周围放一个子 shell:
(IFS=' ' for x in `ls -l $1`; do echo $x; done)
或使用 while | read 代替:
ls -l $1 | while read x; do echo $x; done
还有一个选项,它在相同的 shell 级别上运行 while/read:
while read x; do echo $x; done << EOF $(ls -l $1) EOF
你也可以尝试使用 abc0命令,如果你只想要工作目录中的文件:
find . -d 1 -prune -ls
对他们每个人下命令?
find . -d 1 -prune -exec echo {} \;
只在文件中计算行数?
find . -d 1 -prune -type f -exec wc -l {} \;
那么,为什么没有人建议使用选项来消除他不想处理的部分。
在现代 Debian 上,你只需要得到以下文件:
ls --format=single-column
此外,如果使用完整目录,则不必注意运行它的目录:
ls --format=single-column /root/dir/starting/point/to/target/dir/
我正在使用上面的最后一个命令,我得到了以下输出:
bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz /home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz /home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz /home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz