在一个目录中,有几个文件,例如:
file1
file2
file3
有没有一种简单的方法可以连接这些文件以获得 bash 中的一行(通过"OR"连接),如下所示:
file1 OR file2 OR file3
还是我需要为它编写脚本?
您可以使用此函数打印所有文件名(包括带有空格,换行符或特殊字符的文件名),并以" OR "
作为分隔符(假设您的文件名不包含ASCII代码4
):
orfiles() {
local IFS=$'4'
local out="$*"
echo "${out//$'4'/ OR }"
}
然后称其为:
orfiles *
工作原理:
- 我们将
IFS
(内部字段分隔符)设置为 ASCII4
在函数内部本地 - 我们将
"$*"
的输出存储在局部变量out
中。这会在变量$out
中的每个文件名之后放置4
。 - 最后使用 BASH 字符串替换,我们在打印
$out
输出时将4
全局替换为" OR "
。
在 Unix 系统中,IFS
只是一个字符分隔符,因此它不能存储多字符串" OR "
,我们必须分 2 个步骤完成此操作,如上所示。
你可以简单地用
printf '%s OR ' $(ls -1 *) | sed 's/OR $/''/'; echo -e 'n'
其中ls -1 *
是目录。
应该考虑的时刻是文件名可能包含空格。
使用以下ls+awk解决方案:
ls -1 * | awk '{ r=(r)? r" OR "$0 : $0 }END{ print r }'
带换行符的文件名的解决方法:
echo -e $(ls -1b hello* | awk -v RS= '{gsub(/n/," OR ",$0); gsub(/\ /," ",$0); print $0}')
-b
-ls选项,用于打印非图形字符的 C 样式转义
ls -1|awk -v q='"' '{printf "%s%s", NR==1?"":" OR ", q $0 q}END{print ""}'
LS和AWK的方法,例如文件名包含空格:
kent$ ls -1
file1
file2
'file with OR and space'
kent$ ls -1|awk -v q='"' '{printf "%s%s", NR==1?"":" OR ", q $0 q}END{print ""}'
"file1" OR "file2" OR "file with OR and space"
$ for f in *; do printf '%s%s' "$s" "$f"; s=" OR "; done; printf 'n'
file1 OR file2 OR file3