Как мне перечислить одно имя файла на строку вывода в Linux? - PullRequest
185 голосов
/ 08 октября 2010

Я использую команду ls -a, чтобы получить имена файлов в каталоге, но вывод в одной строке.

Как это:

.  ..  .bash_history  .ssh  updater_error_log.txt

Мне нужна встроенная альтернатива для получения имен файлов, каждое в новой строке, например:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

Ответы [ 5 ]

358 голосов
/ 08 октября 2010

Используйте параметр -1 (обратите внимание, что это «одна» цифра, а не строчная буква «L»), например:

ls -1a

Сначала убедитесь, что ваш ls поддерживает -1. GNU coreutils (устанавливается на стандартные системы Linux) и Solaris; но если сомневаетесь, используйте man ls или ls --help или проверьте документацию. E.g.:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b
118 голосов
/ 08 октября 2010

Да, вы можете легко заставить ls выводить одно имя файла на строку:

ls -a | cat

Объяснение: Команда ls определяет, выводится ли он на терминал, в файл или канал и корректируется соответствующим образом.

Итак, если вы передадите ls -a на Python, он должен работать без особых мер.

28 голосов
/ 09 октября 2010

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 , а затем работать локально.

10 голосов
/ 10 июня 2015

вы можете использовать ls -1

ls -l также сделает работу

1 голос
/ 29 сентября 2016

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

find . -maxdepth 1

Если вы передаете это в другую команду, вы, вероятно, предпочтете разделить ваши имена файлов нулевыми байтами, а не символами новой строки., поскольку нулевые байты не могут встречаться в имени файла (но могут быть новые строки):

find . -maxdepth 1 -print0

Печать этого на терминале, вероятно, будет отображаться как одна строка, потому что нулевые байты обычно не печатаются.Некоторым программам может потребоваться особая опция для обработки ввода, разделенного нулями, например sort * -z.Ваш собственный сценарий также должен учитывать это.

...