найти результаты, содержащие пробел для печати с заключенными в кавычки

Для пользователей, перешедших из других менеджеров пакетов, могут применяться следующие грубые аналогии. Но не делайте из этого слишком много выводов, потому что GUIX позволяет каждому пользователю использовать свой собственный набор пакетов и даже собственную версию GUIX!

guix pullпохож на apt-get updateтем, что загружает новый список доступных пакетов, заменителей и производных. Однако он также устанавливает для вас новую версию GUIX! (по причинам)

guix package -i(синонимыguix installguix package -uаналогичны apt-get installили apt-get upgradeтем, что вы можете устанавливать/обновлять пакеты, но только если вы получили обновленный список пакетов(apt-get update/guix pull)до.

Они меняют разные профили, существующие для разных задач

  • По умолчанию guix pullизменяет профиль ~/.config/guix/current. Этот профиль предназначен для создания профилей и всего, что связано (, например. установка пакетов ).

  • По умолчанию guix installили его синоним guix package -iизменяет профиль ~/.guix-profile. Этот профиль предназначен для любой продуктивной работы (? )работа, которую вы делаете.

См. этот вопрос SO для получения дополнительной информации об этих профилях

0
29.10.2020, 11:10
3 ответа

Вот способ сделать это, используя только find, если ваша версия поддерживает -printf.

find. -name "* *" -printf "\"%p\"\n" -o -print
1
18.03.2021, 22:54

Вы можете сделать это, направив вывод наawk:

find. | awk '/ /{ printf"\"%s\"\n", $0; next } { print }' 
0
18.03.2021, 22:54

Предположим, вы хотите сгенерировать выходные данные в формате CSV с помощью инструментов GNU:

find. -print0 | 
  LC_ALL=C sed -z '/[",[:space:]]/{s/"/""/g; s/.*/"&"/}' |
  tr '\0' '\n'

То есть, если имя файла содержит хотя бы один символ пробела ", ,или ASCII (, включая, помимо прочего, SPC, TAB, CR и новую строку, все специальные в CSV ), переведите "в ""(, как в большинстве форматов CSV избегают "s ), и заключите строку в двойные кавычки.

Эта часть выполняется с использованием NUL в качестве разделителя записи, поскольку это единственный байт, который не может встречаться в пути к файлу. А затем мы переводим NUL в новую строку с помощью tr.

В системах, отличных от -GNU, вы всегда можете прибегнуть кperl:

find. -print0 | perl -l -0 -pe 'if (/[",\s]/) {s/"/""/g; $_ = "\"$_\""}'

После

touch 'a b' $'a\nb' a,b a_b $'a\200b' 'a"b'

Дают:

.
"./a""b"
./a_b
"./a,b"
./a�b
"./a
b"
"./a b"

(где — это представление моего терминала того \200байта, который не образует допустимый символ в моей локали UTF -8 ).

Чтобы исключить .и префикс ./, замените -print0на -mindepth 1 -printf '%P\0'(, хотя -printfотносится к GNU -). Что дает:

"a""b"
a_b
"a,b"
a�b
"a
b"
"a b"

-print0и -mindepthтакже являются расширениями GNU, но с тех пор они были скопированы в несколько других реализаций. Если ваша реализация — одна из немногих, где их до сих пор нет, вы можете заменить:

  • find. -print0сfind. -exec printf '%s\0' {} +
  • find. -mindepth 1 -printf '%P\0'сfind. ! -name. -exec sh -c 'for i do printf "%s\0" "${i#./}"; done' sh {} +
1
18.03.2021, 22:54

Теги

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