2015-02-16 2 views
-2

Используя оболочку bash в терминале Mac OS X, я хочу поместить внутри переменной все имена файлов в текущем каталоге с одним именем в строке (в основном, выход ls -1). Однако, если я:Как расширить ls -1 в переменную в терминале Mac OSX

var=$(ls -1) 
echo $var 

Variable «переменная» содержит содержит все имена файлов, но на одной строке, разделенных пробелами. Как я могу исправить это и получить то, что хочу. В целом, в чем причина такого поведения? Что происходит при расширении ls -1?

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

ls -1 > var 

Заранее спасибо.

+1

Но почему вы хотите это сделать ??? что вы собираетесь делать с этой переменной ??? –

+0

Большое спасибо за объяснения! Хотя я упростил свой вопрос, используя 'ls', я действительно намерен использовать' stat'. Моя цель - написать скрипт, который будет - просмотреть все файлы в каталоге, отсортированном по дате создания - определить все подгруппы файлов, созданные менее чем за шесть секунд. - создать для каждой подгруппы подкаталог, названный в честь даты создания самый ранний файл (YYMMDD-HHMMSS) - переместите каждую подгруппу в ее подкаталог Поэтому мне нужна таблица с двумя столбцами: рождение файла как Unix-время (доступно в версии Mac OSX 'stat') и имя файла. – user3781201

+0

Возможный дубликат [Как выполнить команду echo $ command без нарушения макета] (http://stackoverflow.com/questions/2684216/how-do-i-cho-command-without-breaking-the-layout) – tripleee

ответ

3

Ваша команда var=$(ls -1) работает нормально. Попробуйте echo "$var" (с двойными кавычками).

В echo $var, bash читает $var и передает каждое слово в качестве аргумента в echo. Он обрабатывает пробелы и разрывы строк одинаково. Использование двойных кавычек приводит к тому, что bash обрабатывает $var как один аргумент, а не переформатирует его.

Как упоминалось в mklement0, расширение $var, которое здесь происходит, называется разбиением слов. Найдите «Разделение слов» в man bash для получения дополнительной информации. Переменная IFS (также в man bash) управляет тем, что используют символы bash для разделения слов.

+1

Действительно; также стоит упомянуть, что то, что здесь происходит (разделение значения на слова по пробелам и, таким образом, передача нескольких аргументов), называется _word splitting_, которое является _одной_ так называемых _expansions_, которые bash выполняет на ссылках без кавычек (поиск 'Word Splitting' в 'man bash', или, в более общем плане,' EXPANSIONS'). – mklement0

Смежные вопросы