Linux 迭代ls-l输出的每一行

Linux 迭代ls-l输出的每一行,linux,shell,Linux,Shell,我想迭代输出中的每一行:ls-l/some/dir/* 现在我正在尝试:以美元表示x(ls-l$1);做echo$x;完成 但是,这将分别迭代行中的每个元素,因此我得到: -r--r----- 1. 伊万诺夫 英格 1074 四月 22 13:07 文件1 -r--r----- 1. 伊万诺夫 英格 1074 四月 22 13:17 文件2 但是我想把每一行作为一个整体进行迭代。我该怎么做?这取决于你想对每一行做什么。对于这种类型的处理,awk是一个有用的工具。例如: ls -l | awk

我想迭代输出中的每一行:
ls-l/some/dir/*

现在我正在尝试:
以美元表示x(ls-l$1);做echo$x;完成

但是,这将分别迭代行中的每个元素,因此我得到:

-r--r-----
1.
伊万诺夫
英格
1074
四月
22
13:07
文件1
-r--r-----
1.
伊万诺夫
英格
1074
四月
22
13:17
文件2

但是我想把每一行作为一个整体进行迭代。我该怎么做?

这取决于你想对每一行做什么。对于这种类型的处理,awk是一个有用的工具。例如:

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

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

读取(1)实用程序以及ls(1)命令的输出重定向将执行您想要的操作。

如前所述,awk是用于此操作的正确工具。如果您不想使用awk,而不是逐行解析“ls-l”的输出,您可以迭代所有文件并对每个文件执行“ls-l”,如下所示:

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

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

for x in * ; do echo `ls -ld $x` ; done
IFS='
'
for x in `ls -l $1`; do echo $x; done
如果不想永久设置IFS,请在其周围放置一个子外壳:

(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

读取x时
;做echo$x;完成您还可以尝试
查找
命令。如果您只需要当前目录中的文件:

ls --format=single-column /root/dir/starting/point/to/target/dir/
find-d 1-修剪-ls

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

find-d1-prune-exec echo{}

计算行数,但只计算文件中的行数

find-d1-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

始终引用变量(和命令输出),除非您有特定的原因不引用。find已损坏。我经常收到一些奇怪的错误消息。当命令行完全有效时,它想给我帮助,而且似乎一旦它开始这样做,它将不会停止,直到下次重新启动。关于错误,有时在本质上似乎是随机的。不知道如何报告错误。当管道连接到while时,要小心,while将在子shell中运行,这意味着它无法更改主进程中的变量$1在这里做什么?我需要在我正在编写的接受参数的脚本中使用它。1美元的钱是用来扔东西的。我可以用什么代替1美元来达到同样的效果?我想使用第二种解决方案。@noob in need将其替换为您想要列出的任何目录。您可能需要执行
read-r
,否则bash将从数据中删除未替换的反斜杠。这很有帮助。对于macos上的用户:如果您已经
brew安装了coreutils软件包,那么您的外壳上就会有GNU的ls,名称为
gls
,具有
--format
功能:
gls--format=single column