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 *
工作原理:
- 我们在函数内部将
IFS
(内部字段分隔符)设置为 ASCII 4
- 我们将
"$*"
的输出存储在局部变量 out
中。这将在变量 $out
. 中的每个文件名之后放置 </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
在一个目录下,有几个文件如:
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 *
工作原理:
- 我们在函数内部将
IFS
(内部字段分隔符)设置为 ASCII4
- 我们将
"$*"
的输出存储在局部变量out
中。这将在变量$out
. 中的每个文件名之后放置
</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