Як перерахувати одне ім'я файлу на вихідний рядок у Linux?


229

Я використовую ls -aкоманду для отримання імен файлів у каталозі, але вихід є в одному рядку.

Подобається це:

.  ..  .bash_history  .ssh  updater_error_log.txt

Мені потрібна вбудована альтернатива, щоб отримати імена файлів, кожне в новому рядку, як це:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
ls призначений для відображення списку для споживання людиною. Якщо ви використовуєте ls для будь-яких інших цілей (як, скажімо, для отримання списку файлів у скрипті для повторення), ви, звичайно, використовуєте неправильний інструмент.
Джуліано

2
@juliano - Справді, він повинен споживатися сценарієм python. Чому ви називаєте це неправильним інструментом?
fixxxer

1
@fixxer У момент, коли ви перейдете lsна python, lsбуде видаватися один файл на рядок, як я пояснив у своїй відповіді.
Пітер Г.

6
@fixxxer: Тоді ви його справді неправильно використовуєте. Він форматує лістинг для виведення в користувальницькому терміналі. Він може замінити спеціальні символи у імені файлу, він може опустити символи, які мають особливе значення тощо. Іншими словами, ls форматує список для користувача. Ви хочете неоформлених імен файлів. Якась особлива причина, що ви не використовуєте модуль python 'glob'? docs.python.org/library/glob.html Є також "fnmatch", "dircache" та інші.
Джуліано

@fixxer Ви фактично зробили lsдля виведення pythonта спостерігали за однорядковим виведенням у python?
Пітер Г.

Відповіді:


430

Скористайтеся -1опцією (зверніть увагу, що це "одна" цифра, а не мала літера "L"), наприклад:

ls -1a

По-перше, переконайтеся, що ви lsпідтримуєте -1. GNU coreutils (встановлені на стандартних системах Linux) та Solaris; але якщо є сумніви, використовувати man lsабо ls --helpчи перевірити документацію. Наприклад:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1 Я не знав про -1 (-l так (не все)) Це відображається на сторінці man, але я весь час читав це як
елл

@slashmais - Ах, хороший момент - легко помилитися. Я уточнив у відповіді.
Берт F

1
@dty: для GNU ви отримуєте це задокументовано на ls --helpвиході ... завжди встановлюється ;-)
Тоні Делрой

3
Шукали в Google для, linux ls one file per lineі це була головна стаття. Не можу повірити, наскільки багатослівна обрана відповідь, або що ця відповідь має менше голосів, ніж відповідь, який відповідає коту. ls -1фут.
кранток

3
lsза замовчуванням -1поведінка, коли вихід не підключений до терміналу.
codeforester

131

Так, ви можете легко зробити lsвихід одного імені файлу на рядок:

ls -a | cat

Пояснення: Команда lsвизначає, чи є вихід на термінал або в файл або трубу, і відповідно налаштовується.

Отже, якщо ви підключите ls -aдо python, він повинен працювати без особливих заходів.


2
Ого, це геніально. Перевага перед прийнятою відповіддю - ця програма насправді працює на оболонці Android / adb - де lsлише якась -1
зведена

Як би ти уникнув показу .та .."файлів" у висновку?
matanster

@matanster: Це залежить, чи хочете ви взагалі бачити точкові файли? Якщо ні, просто відпустіть параметр -a.
Петро Г.

29

Ls призначений для споживання людиною, і ви не повинні аналізувати його вихід .

У скриптах оболонки є кілька випадків, коли аналіз виводу ls працює, є найпростішим способом досягнення бажаного ефекту. Оскільки ls може керувати символами, що не належать до ASCII, та керуючими символами в іменах файлів, ці випадки є підмножиною тих, які не потребують отримання імені файлу ls.

У python абсолютно немає підстав для посилань ls. У Python lsвбудована вся функціональність. Використовуйте os.listdirдля переліку вмісту каталогу та os.statабо osдля отримання метаданих файлів. Інші функції osмодулів, ймовірно, також стосуватимуться вашої проблеми.


Якщо ви отримуєте доступ до віддалених файлів через ssh, досить надійний спосіб перерахування імен файлів здійснюється через sftp:

echo ls -1 | sftp remote-site:dir

Це друкує одне ім’я файлу на рядок, і на відміну від lsутиліти, sftpне маніпулює недрукованими символами. Ви все одно не зможете надійно перерахувати каталоги, де ім'я файлу містить новий рядок, але це робиться рідко (пам’ятайте це як потенційну проблему безпеки, а не проблему зручності використання).

У python (будьте уважні, що метахарактори оболонки повинні бути уникнуті remote_dir):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

Для більш складних взаємодій знайдіть пакетний режим sftp в документації.

У деяких системах (Linux, Mac OS X, можливо, деякі інші рішення, але, безумовно, не Windows), інший підхід полягає в монтажі віддаленої файлової системи через ssh з sshfs , а потім працювати локально.


Я підключений через SSH до віддаленої машини. Я не знайшов способу виконати функцію python на зразок os.listdir на віддаленій машині в один рядок. Звідси і це питання. Я не хочу писати сценарій для простого переліку файлів. Чи є якийсь спосіб вирішити цю проблему?
fixxxer

@fixxxer: ssh змінює ситуацію, це такі речі, які ви мали б згадати у своєму первісному запитанні! Я думаю, що sftp підходить для вашого випадку використання.
Жил "ТАК - перестань бути злим"

Вибачте за плутанину. Чи є спосіб я також вставити пароль у "command_line"?
fixxxer

@fixxxer: Не знаю, автори ssh хмуряться на паролі, що зберігаються у простому тексті, і, як правило, не спрощують це. Ви дійсно повинні налаштувати аутентифікацію на основі ключів (в Інтернеті є багато навчальних посібників та питань на сайті superuser.com ).
Жил 'ТАК - перестань бути злим'

11

ви можете використовувати ls -1

ls -l також зробить роботу


У верхній відповіді вже згадуються точні речі, які ви сказали. також питання, зокрема, говорить, що ls -lне слід використовувати.
DevX

2

Легко, доки ваші імена файлів не містять нових рядків:

find . -maxdepth 1

Якщо ви переносите це в іншу команду, ви, мабуть, вважаєте за краще розділити свої імена файлами з нульовими байтами, а не з новими рядками, оскільки нульові байти не можуть зустрічатися у імені файлу (але нові рядки можуть бути):

find . -maxdepth 1 -print0

Друк, що на терміналі, ймовірно, відображатиметься як один рядок, оскільки нульові байти зазвичай не надруковані. Для деяких програм може знадобитися певна опція для обробки нульового введення, наприклад, sorts -z. Ваш власний сценарій так само повинен був би врахувати це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.