我想用来find
查找一些文件,并将所有文件作为单行返回(没有换行符),并在文件之间使用自定义分隔符。
例如,三个文件的结果将是
/my/file/1::/my/file/2::/my/file/3
代替
/my/file/1
/my/file/2
/my/file/3
有没有什么方法可以结合使用标准unix工具来实现这一点find
?
答案1
find
通过和的 GNU 实现sed
,您可以使用:
find . -type f -printf '%p::' | sed '$s/::$/\n/'
-printf
GNU 的谓词将find
在由 分隔的单行中打印文件名::
,然后用换行符sed
替换最后一行(此处未分隔)的最后一个。::
例子 :
$ find . -type f -printf '%p\n'
./foo
./test file
whose name
contains newline characters and ::
./bar
$ find . -type f -printf '%p::' | sed '$s/::$/\n/'
./foo::./test file
whose name
contains newline characters and ::::./bar
的标准等效项-printf '%p::'
是-exec printf '%s::' {} +
.该 GNUsed
表达式没有等效项,因为 POSIXsed
无法处理非文本。
答案2
和zsh
:
(){ print -r -- ${(j[::])argv}; } /my/**/*(N.)
要查找下面的所有常规非隐藏文件/my/
并打印它们的路径(按词法排序,但请参阅n
,o
和O
限定符以获取替代排序顺序),j
请使用::
.
答案3
在许多 find 实现中都找不到 -prinf。对于这些情况,您可以使用该-exec
命令实现相同的目的。
find "/some/dir" -exec echo -n {}"|" \;
echo
打印每个目录条目
修饰符-n
避免打印新行字符
该"|"
字符附加在每个条目之后
如果您的 echo 实现不支持该-n
标志,很简单:
find "/some/dir" -exec printf "%s" {}"|" \;
上述内容几乎可以在任何 bash shell 中运行,包括 busybox,它存在于 OpenWRT 或 VMWare ESXi 等面向简约固件的发行版中。
(*) 请注意,最后一个示例中的 printf 调用是外部查找,而不是第一个答案中提出的查找选项。 printf 作为二进制文件几乎存在于您能想到的所有发行版中,即使是最小的发行版。