我想要迭代遍历每行输出结果,使用命令: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
但是我想整行遍历,该怎么做?
我想要迭代遍历每行输出结果,使用命令: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
但是我想整行遍历,该怎么做?
将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
read -r
,bash会从数据中删除未转义的反斜杠。 - Rag这取决于你想对每一行做什么。awk是处理此类任务的有用工具。例如:
ls -l | awk '{print $9, $5}'
在我的系统上,该命令会打印出目录中每个项目的名称和大小。
如前所述,awk是处理此类问题的正确工具。如果您不想使用awk,而是逐个文件迭代并对每个单独的文件执行“ls -l”,则可以避免逐行解析“ls -l”的输出,方法如下:
for x in * ; do echo `ls -ld $x` ; done
您也可以尝试使用find
命令。如果您只想要当前目录中的文件:
find . -d 1 -prune -ls
对它们中的每一个运行一个命令?
find . -d 1 -prune -exec echo {} \;
计算行数,但只在文件中?
find . -d 1 -prune -type f -exec wc -l {} \;
使用read(1)工具和ls(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
gls --format=single-column
。 - Chris