Когда мы перечисляем файлы в unix с помощью команды ls -l
, на выходе получается таблица с пробелом в качестве разделителя, например, следующая
(jupyter-lab) ➜ mylab ls -l
total 2
drwxr-sr-x. 2 hs0424 ragr 0 Feb 1 12:17 A bad directory
drwxr-sr-x. 2 hs0424 ragr 0 Feb 1 12:18 A very bad directory
Я хочу преобразовать в файл, разделенный табуляцией (.tsv
), просто изменив пробелы на \t
, например, ls -l | sed -E 's/ +/\t/g'
, это не сработает, поскольку имена файлов содержат пробелы. У нас есть лучшее решение?
Трудно показать ожидаемый результат с помощью вкладок, но если мы используем \t
вместо вкладки, я хочу что-то вроде следующего:
(jupyter-lab) ➜ mylab ls -l
total 2
drwxr-sr-x.\t2\ths0424\tragr\t0\tFeb 1\t12:17\tA bad directory
drwxr-sr-x.\t2\ths0424\tragr\t0\tFeb 1\t12:18\tA very bad directory
(Редактировать 1) Мы можем предположить доступ к инструментам GNU
И, что не менее важно, на какую ОС/дистрибутив вы ориентируетесь? Можем ли мы предположить инструменты GNU?
обновите вопрос, чтобы показать ожидаемый результат; также может представлять интерес объяснение преимущества (?) замены пробелов вкладками
(«Ожидаемый результат» важен: не все версии операционных систем ls
ведут себя одинаково! Стандарт POSIX определяет часть его вывода, но он никоим образом не является исчерпывающим, что является частью того, почему программный анализ ls является изначально ненадежный).
только что добавил ожидаемый результат
@CharlesDuffy, пожалуйста, предложите альтернативы, хотелось бы узнать больше.
@CharlesDuffy только что увидел ваш ответ, сейчас тестирует его.
Альтернативы зависят от «почему». Я добавил ответ и ссылку выше, надеюсь, информативную; также см. BashFAQ #87.
Обратите внимание, кстати, что имена файлов могут содержать буквальные символы новой строки; поэтому безопаснее иметь их в форме с разделителями NUL, чем в форме с разделителями новой строки.
Я не думаю, что есть действительно полезный способ сделать это. Конечно, вы можете использовать tr
для перевода каждого пробела в табуляцию, но это означает, что пробелы внутри имени файла также становятся табуляцией. Возможно, имеет смысл написать свой кастом ls
для этого. Вы можете перебрать все файлы и использовать команду stat
для сбора информации о файле, который вам нужен для входа в вашу таблицу.
Почему это помечено bash * и zsh?
@ user1934428 Я думал, что могут быть функции, специфичные для оболочки. Для решения без ls
проверьте ответ.
Используйте GNU find -printf
или stat
, любой из которых позволяет указать строку произвольного формата вместо ls
.
find . -mindepth 1 -maxdepth 1 -printf '%M\t%y\t%g\t%G\t%u\t%U\t%f\t%l\n'
или
# for normal cases
stat --printf='%A\t%G\t%g\t%U\t%u\t%n\n' *
# for directories where filenames could exceed command line length limit
printf '%s\0' * | xargs -0 stat --printf='%A\t%G\t%g\t%U\t%u\t%n\n'
Зачем ты вообще используешь
ls
?