当我跑步的时候
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
是默认操作,因此可以省略。
由于您想从文件名字符串中删除路径,因此可以使用选项-prinf
fromfind
并使用以下格式进行格式化-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}'