gpt4 book ai didi

linux - 在 shell 脚本中列出文件

转载 作者:IT王子 更新时间:2023-10-29 00:26:23 25 4
gpt4 key购买 nike

当我尝试下面的代码时,我得到了所有文件名以 E 开头的文件

#!/bin/bash

data=$(ls -trh E*)
for entry in ${data}
do
echo ${entry}
done

但是如果我尝试下面的代码,它从参数中获取通配符,我只会得到第一个文件名

#!/bin/bash

data=$(ls -trh $1)
for entry in ${data}
do
echo ${entry}
done

谁能帮我解决这个问题..

当我给出类似 myscript.sh 'E*' 的引号时,它工作正常,有没有什么方法可以在不给出引号的情况下做到这一点?

最佳答案

这是一个shell扩展问题。

您的 shell 将在传递给您的进程之前解释通配符。例如:

脚本.sh

#!/bin/bash
echo $1 $2 $3

使用通配符运行上面的代码:

> ./script.sh E*
Eva Eve Evolve

如果你想在没有 shell 解释的情况下传递一个参数,你必须引用它:

> ./script.sh 'E*'
E*

使用 find 的更好解决方案:

您实际要做的是获取给定目录中所有文件和文件夹的列表,按照修改时间倒序排列(最早的在前)。 ls 的输出解析起来非常痛苦。最好改用功能强大且灵活的 find 命令。

这是一条单线:

>  find ./ -maxdepth 1 -printf "%A@ %f\0" | sort -z -n | while read -d '' date line; do echo "$line"; done

这可能是神秘的,但一旦解释就有意义。

  • 不递归地查找此目录中的所有文件 find ./-maxdepth 1
  • 对于每个文件,在秒内打印出它们的最后修改时间 -printf "%A@
  • 及其文件名,由空字符分隔 %f\0"
  • 按最后修改时间(数字)对空分隔字符串进行排序sort -z -n
  • 对于每个以 null 分隔的字符串,将时间戳分配给“日期”,并将该行的其余部分分配给“行”:while read -d '' date line
  • 打印行 echo "$line"

比如在我的目录下:

> ls -l
total 4296
drwxr-xr-x 2 bfer cvs 4096 2012-03-05 15:49 colortry
drwxr-xr-x 3 bfer cvs 4096 2012-03-27 15:05 githug
drwxr-xr-x 3 bfer cvs 4096 2012-03-12 17:18 hooks-bare
drwxr-xr-x 3 bfer cvs 4096 2012-03-28 12:38 java
-rw-r--r-- 1 bfer cvs 4025413 2012-03-27 12:53 mozdebug
drwxr-xr-x 2 bfer cvs 4096 2012-02-16 12:54 mustache_bug_demo
-rwxr-xr-x 1 bfer cvs 113 2012-03-30 12:20 try.sh
> find ./ -maxdepth 1 -printf "%A@ %f\0" | sort -z -n | while read -d '' date line; do echo "$line"; done
mozdebug
colortry
hooks-bare
mustache_bug_demo
githug
java
try.sh
./

如果您不想要 ./ 结果,只需将其从最终集中取出即可。

updated: With Sorpigal's suggestion to handle filenames with newlines.

关于 shell 扩展的进一步说明

这与括号和符号之类的东西相同。例如,以下 curl 命令将无法按预期工作:

> curl example.com/site?q=hello&name=bob
> echo 23/(7/98) | bc

因为和号和圆括号在作为参数传递给进程之前将由 shell 解释。

要使其正常工作,您必须引用参数:

> curl "example.com/site?q=hello&name=bob"
> echo "23/(7/98)" | bc

关于linux - 在 shell 脚本中列出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9940688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com