如何使用ls? bash 变量中的选项?

如何使用ls? bash 变量中的选项?

我想使用 ls ? Bash 变量中的选项。

如何让脚本执行与 相同的操作ls -lt foobar_??????.log

$ cat foobar_ls.sh 

#!/bin/bash
FOOBAR_LIST="foobar_??????.log"
ls -lt "$FOOBAR_LIST"

这是提示版本:

$ls -lt foobar_??????.log
-rw-r--r-- 1 foobar foobiz 0 Nov  1 14:58 foobar_000003.log
-rw-r--r-- 1 foobar foobiz 0 Nov  1 14:58 foobar_000002.log
-rw-r--r-- 1 foobar foobiz 0 Nov  1 14:58 foobar_000001.log

这是我的脚本版本:

$ ./foobar_ls.sh 

ls: cannot access foobar_??????.log: No such file or directory

答案1

?不是 的功能ls,而是 shell 的功能,称为文件名扩展或通配符扩展或模式匹配或通配。您必须让 shell 执行通配符扩展,以便ls接收匹配文件名的列表。

如果变量中有一个带有通配符的字符串,并且您想要将这些通配符扩展为匹配的文件名,请将变量替换保留为不带引号的。这是“split+glob”运算符:该值被拆分为以空格分隔的部分,每个部分都被匹配文件名的列表替换,但与任何文件名不匹配的部分保持不变。

FOOBAR_LIST="foobar_??????.log"
ls -lt $FOOBAR_LIST

答案2

这对我有用,但根据您所做的事情,将该变量不加引号可能不是一个好主意。您可能还应该使用以下以外的东西lshttp://mywiki.wooledge.org/ParsingLs

foob​​ar_ls.sh

#!/bin/bash
FOOBAR_LIST="foobar_??????.log"
ls -lt ${FOOBAR_LIST}

要重命名这些文件,您可以执行以下操作之一:

shopt -s nullglob
for file in /path/to/files/foobar_??????.log; do
        mv "$file" "${file}.old"
done
shopt -u nullglob

或者

find /path/to/files -type f -name 'foobar_??????.log' -exec mv {} {}.old \;

相关内容