如何将 find 的输出视为字符串而不是对文件或目录的引用

如何将 find 的输出视为字符串而不是对文件或目录的引用

当我跑步的时候

find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d

我得到了给定路径的所有子目录的输出。例如

/home/user/foo/bar/a
/home/user/foo/bar/b
...
/home/user/foo/bar/abcd

现在我想将该输出用作字符串,因此我添加了-print替换一些找到的结果

find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d -print | xargs sed 's#/home/user/foo/bar/#some_text"#g'

但结果并不如预期

sed:/home/user/foo/bar/./abc 上的读取错误:是一个目录

显然 sed 不会将管道参数视为我想要的字符串,例如

some_text/a
some_text/b
...
some_text/abcd

答案1

最好使用find-printf选项删除路径:

find ~/foo/bar/ -mindepth 1 -maxdepth 1 -type d -printf 'some_text/%P\n'

%P 文件的名称以及找到该文件的起点的名称已被删除。


要修复您的sed版本,请不要使用xargs,只需直接通过管道传输到,sed就像@choroba 已经评论的那样。

答案2

您可以将输出find直接通过管道传输到sed(否xarg
-print是默认操作,因此可以省略。
由于您想从文件名字符串中删除路径,因此可以使用选项-prinffromfind并使用以下格式进行格式化-printf '%P\n'(请参阅man 3 printf

find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d | sed 's#/home/user/foo/bar#some_text#g'
# or
find  ~/foo/bar/. -mindepth 1 -maxdepth 1 -type d -printf '%P\n'

答案3

您还可以使用awk以下命令替换直到最后/一个some_text

find ~/foo/bar/ -mindepth 1 -maxdepth 1 -type d | awk '{gsub(/^.*\//, "some_text/"); print}'

相关内容