Подтвердить что ты не робот

Как указать одно имя файла на выходную строку в Linux?

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

Пример: . .. .bash_history .ssh updator_error_log.txt

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

.  
..  
.bash_history  
.ssh  
updator_error_log.txt
4b9b3361

Ответ 1

Используйте man ls, чтобы увидеть, поддерживает ли ваш ls параметр -1 (что "одна" цифра, а не строчная буква "L" - thanks @slashmais), например

http://docs.oracle.com/cd/E19082-01/819-2239/6n4hsf6oc/index.html

...

-1

   Prints one entry per line of output.

GNU/Linux ls поддерживает его, поэтому используйте:

ls -1a

Ответ 2

Да:

ls -a | cat

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

Ответ 3

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

Ответ 4

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

ls -l также выполнит работу

Ответ 5

Просто ради разнообразия:

ls | tr ' ' '\n'
Команда

tr переводит все пробелы в новые строки. Поскольку ls без аргументов дает только имена файлов, разделенные пробелом, вывод отображается как одно имя файла в строке.

Ответ 6

Легко, если ваши имена файлов не включают символы новой строки:

find . -maxdepth 1

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

find . -maxdepth 1 -print0

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