迭代ls -l输出的每一行

139

我想要迭代遍历每行输出结果,使用命令: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

但是我想整行遍历,该怎么做?


1
除非您有特定的原因,否则请始终引用变量(和命令输出)。 - glenn jackman
6个回答

279

将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

15
当使用管道传输数据到while循环时,请注意while循环将在子shell中运行,这意味着它无法更改主进程中的变量。 - Reorx
1
这里的$1是做什么用的?我需要在一个接受参数的脚本中使用它。$1会导致问题。有什么可以代替$1来达到同样的效果吗?我想使用第二种解决方案。 - noob-in-need
@noob-in-need 用你想要列出的目录替换它 - vpzomtrrfrt
3
如果不使用read -r,bash会从数据中删除未转义的反斜杠。 - Rag

7

这取决于你想对每一行做什么。awk是处理此类任务的有用工具。例如:

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

在我的系统上,该命令会打印出目录中每个项目的名称和大小。


3

如前所述,awk是处理此类问题的正确工具。如果您不想使用awk,而是逐个文件迭代并对每个单独的文件执行“ls -l”,则可以避免逐行解析“ls -l”的输出,方法如下:

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

3

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

find . -d 1 -prune -ls

对它们中的每一个运行一个命令?

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

计算行数,但只在文件中?

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


查找功能出现故障。我经常会收到一些奇怪的错误消息。即使命令行是完全有效的,它也想给我提供帮助,而且似乎一旦开始这样做,除非重新启动,否则它不会停止。有时候错误似乎是随机的。不确定如何报告这个错误。 - Jim Michaels

1

使用read(1)工具和ls(1)命令的输出重定向,可以实现您想要的效果。


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

这很有帮助。对于那些使用macOS的人:如果你已经安装了coreutils包,那么你的shell上将拥有GNU的ls,并且名称为“gls”,它具有“--format”功能:gls --format=single-column - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接