遍历ls -l输出的每一行


119

我想遍历输出的每一行: 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
除非有特殊原因,否则请始终引用变量(和命令输出)。
格伦·杰克曼

Answers:


246

将IFS设置为换行符,如下所示:

IFS='
'
for x in `ls -l $1`; do echo $x; done

如果您不想永久设置IFS,请在其周围放一个子外壳:

(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

12
当心管道到while时,while将在子shell中运行,这意味着它不能在主过程中更改变量
Reorx

1
$ 1在这里做什么?我需要在正在编写的接受参数的脚本中使用它。$ 1丢掉了东西。我可以放那里什么而不是$ 1来获得相同的效果?我想使用第二种解决方案。
noob-in-need需要

@ noob-in-need用您想要列出的任何目录替换它
vpzomtrrfrt

1
您可能要这样做read -r,否则bash将从数据中删除未转义的反斜杠。
Brian Gordon

6

这取决于您要对每一行执行的操作。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 {} \;


找到坏了。我经常收到一些奇怪的错误消息。它想在命令行完全有效时给我帮助,并且似乎一旦开始执行此操作,它就不会停止直到下一次重新启动。从本质上讲,有时关于错误是随机的。不知道如何报告错误。
吉姆·迈克尔斯


-1

因此,为什么没有人建议仅使用一些选项来消除他不想处理的部分。

在现代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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.