Как объединить несколько строк с именами файлов в одну с пользовательским разделителем?

Получите и сохраните время либо с iPhone, либо с NIST и текущего времени исполнения из функции повышения производительности BSD. Для времени NIST см. Как я могу получить реальное время в iPhone, а не время, заданное пользователем в настройках?

Когда вы хотите проверить перезагрузку, получите новые значения этих , вычислить прошедшее время для каждого и сравнить прошедшее время. Исходя из разницы, вы должны иметь возможность определить перезагрузку.

377
задан kenorb 29 May 2015 в 22:02
поделиться

15 ответов

Аналогично самому первому варианту, но без конечного разделителя.

ls -1 | paste -sd "," -
579
ответ дан jpbochi 29 May 2015 в 22:02
поделиться

Версия Quick Perl с завершающей косой чертой:

ls -1 | perl -E 'say join ", ", map {chomp; 

Версия Quick Perl с завершающей косой чертой:

[110]

Объяснить:

  • perl -E: выполнить Perl с поддержкой функций (скажем, ...)
  • говорят: печатать с возвратом носителя
  • join ",", ARRAY_HERE: соединять массив с помощью ","
  • map {chomp; $ _} ROWS: удалить из каждой строки возвращаемую несущую и вернуть результат
  • <>: stdin, каждая строка является ROW, в сочетании с картой она создаст массив каждой ROW
} <>'

Объяснить:

  • perl -E: выполнить Perl с поддержкой функций (скажем, ...)
  • говорят: печатать с возвратом носителя
  • join ",", ARRAY_HERE: соединять массив с помощью ","
  • map {chomp; $ _} ROWS: удалить из каждой строки возвращаемую несущую и вернуть результат
  • <>: stdin, каждая строка является ROW, в сочетании с картой она создаст массив каждой ROW
0
ответ дан Celogeek San 29 May 2015 в 22:02
поделиться

В добавление к ответу majkinetor, вот способ удаления конечного разделителя (поскольку я пока не могу просто комментировать его ответ):

ls -1 | awk 'ORS=","' | head -c -1

Просто удалите столько конечных байтов, сколько ваш разделитель считает для .

Мне нравится этот подход, потому что я могу использовать многосимвольные разделители + другие преимущества awk:

ls -1 | awk 'ORS=", "' | head -c -2

РЕДАКТИРОВАТЬ

Как заметил Питер, отрицательно Подсчет байтов не поддерживается в родной версии главы MacOS. Это, однако, может быть легко исправлено.

Сначала установите coreutils. «Основные утилиты GNU - это базовые утилиты для работы с файлами, оболочками и текстом в операционной системе GNU».

brew install coreutils

Команды, также предоставляемые MacOS, устанавливаются с префиксом «g». Например, gls.

Как только вы это сделаете, вы можете использовать ghead с отрицательным числом байтов или лучше, сделать псевдоним:

alias head="ghead"
1
ответ дан Aleksander Stelmaczonek 29 May 2015 в 22:02
поделиться

ls производит один выходной столбец при подключении к трубе, поэтому -1 является избыточным.

Вот еще один ответ perl, использующий встроенную функцию join, которая не оставляет завершающий разделитель:

ls | perl -F'\n' -0777 -anE 'say join ",", @F'

Непонятный -0777 заставляет perl прочитать весь ввод перед запуском программы.

альтернатива sed, которая не оставляет завершающий разделитель

ls | sed '$!s/$/,/' | tr -d '\n'
2
ответ дан Thor 29 May 2015 в 22:02
поделиться

Вы можете использовать:

ls -1 | perl -pe 's/\n$/some_delimiter/'
2
ответ дан codaddict 29 May 2015 в 22:02
поделиться

Если ваша версия xargs поддерживает флаг -d, тогда это должно сработать

ls  | xargs -d, -L 1 echo

-d - это флаг-разделитель

Если у вас нет -d, вы можете попробовать следующее

ls | xargs -I {} echo {}, | xargs echo

Первый xargs позволяет вам указать разделитель, который является запятой в этом примере.

3
ответ дан Chris J 29 May 2015 в 22:02
поделиться

Эта команда для поклонников PERL:

ls -1 | perl -l40pe0

Здесь 40 - восьмеричный ascii-код для пространства.

-p будет обрабатывать построчно и печатать

-l позаботится о замене завершающего \ n на символ ascii, который мы предоставляем.

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

0 означает, что на самом деле нет команды для выполнения.

perl -e0 совпадает с perl -e ''

7
ответ дан Sidharth C. Nadhan 29 May 2015 в 22:02
поделиться

просто bash

mystring=$(printf "%s|" *)
echo ${mystring%|}
7
ответ дан ghostdog74 29 May 2015 в 22:02
поделиться

Не изобретай велосипед.

ls -m

Это именно так.

9
ответ дан Tulains Córdova 29 May 2015 в 22:02
поделиться

Я думаю, что это круто

ls -1 | awk 'ORS=","'

ORS - это «разделитель выходных записей», так что теперь ваши строки будут соединяться запятой.

19
ответ дан rogerdpack 29 May 2015 в 22:02
поделиться

Чтобы избежать потенциальной путаницы новой строки для tr, мы могли бы добавить флаг -b к ls:

ls -1b | tr '\n' ';'
6
ответ дан yabt 29 May 2015 в 22:02
поделиться

Парсинг ls в целом не рекомендуется , поэтому альтернативным лучшим способом является использование find, например:

find . -type f -print0 | tr '\0' ','

Или с использованием find и paste:

find . -type f | paste -d, -s

Для общего объединения нескольких строк (не относящихся к файловой системе) проверьте: Краткое и переносимое «соединение» в командной строке Unix .

13
ответ дан Community 29 May 2015 в 22:02
поделиться

Комбинация настроек IFS и использования "$*" может сделать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочки

(set -- *; IFS=,; echo "$*")

Для захвата вывода,

output=$(set -- *; IFS=,; echo "$*")
14
ответ дан glenn jackman 29 May 2015 в 22:02
поделиться

Это заменяет последнюю запятую новой строкой:

ls -1 | tr '\n' ',' | sed 's/,$/\n/'

ls -m включает переводы строки с шириной экрана (например, 80-й).

В основном Bash (только ls является внешним):

saveIFS=$IFS; IFS= 

Использование readarray (он же mapfile) в Bash 4:

readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS

Благодаря gniourf_gniourf для предложения.

\n' files=($(ls -1)) IFS=, list=${files[*]} IFS=$saveIFS

Использование readarray (он же mapfile) в Bash 4:

readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS

Благодаря gniourf_gniourf для предложения.

23
ответ дан Dennis Williamson 29 May 2015 в 22:02
поделиться

РЕДАКТИРОВАТЬ : Просто " ls -m " Если вы хотите, чтобы ваш разделитель был запятой

Ах, сила и простота !

ls -1 | tr '\n' ','

Поменяйте запятую ", " на любую, какую хотите. Обратите внимание, что это включает "запятую"

351
ответ дан rogerdpack 29 May 2015 в 22:02
поделиться