迭代ls -l输出的每一行

我想在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
工程
1074
四月
22
13:07
文件1

-r – R的—–
1
ivanevf
工程
1074
四月
22
13:17
文件2

不过,我想遍历每一行。

我怎么做?

谢谢。

将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 改为:

 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 
 #!/bin/bash for x in "$(ls -l $1)"; do echo "$x" done 

这取决于你想要做的每一行。 awk对于这种types的处理是一个有用的工具。 例:

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

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

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

find . -d 1 -prune -ls

对他们每个人运行一个命令?

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

计数行,但只在文件中?

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

如前所述,awk是正确的工具。 如果您不想使用awk,而不是逐行parsing“ls -l”的输出,则可以遍历所有文件,并为每个单独的文件执行“ls -l”,如下所示:

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

read(1)实用程序以及ls(1)命令的输出redirect将执行您所需的操作。

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

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