unix 将文件列表连接成在线

unix concatenate list of files into on line

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

file1 
file2 
file3

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

file1 OR file2 OR file3

或者我需要为它写一个脚本吗?

你可以简单地用

printf '%s OR ' $(ls -1 *) | sed 's/OR $/''/'; echo -e '\n'

其中 ls -1 * 是目录。

应该考虑的时刻是文件名可能包含空格。
使用以下 ls + awk 解决方案:

ls -1 * | awk '{ r=(r)? r" OR "[=10=] : [=10=] }END{ print r }'

文件名带有换行符的解决方法:

echo -e $(ls -1b hello* | awk -v RS= '{gsub(/\n/," OR ",[=11=]); gsub(/\ /," ",[=11=]); print [=11=]}')
  • -b - ls 为非图形字符打印 C 风格转义符的选项

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

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

然后将其命名为:

orfiles *

工作原理:

  1. 我们在函数内部将 IFS(内部字段分隔符)设置为 ASCII 4
  2. 我们将 "$*" 的输出存储在局部变量 out 中。这将在变量 $out.
  3. 中的每个文件名之后放置 </code> <li>最后使用 BASH 字符串替换,我们在打印 <code>$out. 的输出时将 </code> 全局替换为 <code>" OR "

在 Unix 系统中 IFS 只是一个单字符分隔符,因此它不能存储多字符串 " OR ",我们必须按上面所示的 2 个步骤来完成此操作。

ls -1|awk -v q='"' '{printf "%s%s", NR==1?"":" OR ", q [=10=] 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 [=11=] 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