迭代ls -l输出的每一行

时间:2010-05-18 18:24:25

标签: linux shell

我想迭代ls -l / some / dir / *输出中的每一行 现在我正在尝试:for x in $(ls -l $1); do echo $x done,但是这会分别迭代行中的每个元素,所以我得到了

  

-r - r -----
  1
  ivanevf
  英格   1074
  4月   22
  13:07
  File1

     

-r - r -----
  1
  ivanevf
  英格   1074
  4月   22
  13:17
  File2

我想整个迭代每一行。

我该怎么做?

感谢。

6 个答案:

答案 0 :(得分:223)

将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)

或者在使用时使用请改为阅读:

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

答案 1 :(得分:7)

这取决于你想要对每一行做什么。 awk是这种处理的有用实用程序。例如:

 ls -l | awk '{print $9, $5}'

..在我的系统上打印目录中每个项目的名称和大小。

答案 2 :(得分:4)

如前所述,awk是正确的工具。如果你不想使用awk,而不是逐行解析“ls -l”的输出,你可以迭代所有文件并为每个单独的文件做一个“ls -l”,如下所示:

for x in * ; do echo `ls -ld $x` ; done

答案 3 :(得分:4)

您也可以尝试find命令。如果您只想要当前目录中的文件:

  

find . -d 1 -prune -ls

对每个人运行命令?

  

find . -d 1 -prune -exec echo {} \;

计算行数,但仅限于文件?

  

find . -d 1 -prune -type f -exec wc -l {} \;

答案 4 :(得分:2)

read(1)实用程序以及ls(1)命令的输出重定向将完成您想要的操作。

答案 5 :(得分:0)

那么,为什么没有人建议只使用消除他不想处理的部分的选项。

在现代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