在 ls-l 输出的每一行上迭代

我想循环遍历: ls -l /some/dir/*的输出中的每一行

现在我正在尝试: 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

但是,我想将每一行作为一个整体进行迭代。我该如何做呢?

124034 次浏览

这取决于您想对每一行做什么。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