Когда я запускаю
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
Удаление пути лучше сделано с помощью find
-printf
опция:
find ~/foo/bar/ -mindepth 1 -maxdepth 1 -type d -printf 'some_text/%P\n'
Имя Файла %P с названием отправной точки, под которой это было найдено удаленным.
Зафиксировать Ваш sed
версия, не использовать xargs
, просто передайте по каналу непосредственно к sed
как @choroba прокомментированный alrady.
Можно передать вывод по каналу к find
непосредственно к sed
(нет xarg
)
-print
действие по умолчанию, таким образом, оно может быть опущено
Так как Вы хотите удалить путь из строки имени файла, можно использовать -prinf
опция от find
и формат это с -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'
Вы могли также использовать awk
заменять все до последнего /
с some_text
:
find ~/foo/bar/ -mindepth 1 -maxdepth 1 -type d | awk '{gsub(/^.*\//, "some_text/"); print}'