Как обрабатывать вывод 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
0
задан 30 July 2019 в 12:22

3 ответа

Удаление пути лучше сделано с помощью find -printf опция:

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

Имя Файла %P с названием отправной точки, под которой это было найдено удаленным.


Зафиксировать Ваш sed версия, не использовать xargs, просто передайте по каналу непосредственно к sed как @choroba прокомментированный alrady.

4
ответ дан 23 October 2019 в 08:17

Можно передать вывод по каналу к 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'
2
ответ дан 23 October 2019 в 08:17

Вы могли также использовать awk заменять все до последнего / с some_text:

find ~/foo/bar/ -mindepth 1 -maxdepth 1 -type d | awk '{gsub(/^.*\//, "some_text/"); print}'
1
ответ дан 23 October 2019 в 08:17

Другие вопросы по тегам:

Похожие вопросы: