UNIX 将文件列表连接到 On Line



在一个目录中,有几个文件,例如:

file1 
file2 
file3

有没有一种简单的方法可以连接这些文件以获得 bash 中的一行(通过"OR"连接),如下所示:

file1 OR file2 OR file3

还是我需要为它编写脚本?

您可以使用此函数打印所有文件名(包括带有空格,换行符或特殊字符的文件名),并以" OR "作为分隔符(假设您的文件名不包含ASCII代码4):

orfiles() {
local IFS=$'4'
local out="$*"
echo "${out//$'4'/ OR }"
}

然后称其为:

orfiles *

工作原理:

  1. 我们将IFS(内部字段分隔符)设置为 ASCII4在函数内部本地
  2. 我们将"$*"的输出存储在局部变量out中。这会在变量$out中的每个文件名之后放置4
  3. 最后使用 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

相关内容

最新更新