2015-03-01 3 views
0

Я хочу сохранить вывод команды ls в моем скрипте bash в переменной и использовать каждое имя файла в цикле, но, например, один файл в каталоге имеет имя «Привет мир», когда я variable=$(ls) «Hello» и «мир» в конечном итоге, как две отдельные записи, и когда я пытаюсь сделатьсохранение вывода команды ls, состоящей из файлов с пробелами в их именах

for i in $variable 
do 
    mv $i ~ 
done 

он показывает ошибку, что файлы «Hello» и «мир» Безразлично» t существует. Есть ли способ получить доступ ко всем файлам в текущем каталоге и выполнить некоторую команду, даже если в их именах есть пробелы.

ответ

2

Скажите это мне: don't parse the output of ls! Для получения дополнительной информации см. this post on Unix.SE.

Лучший способ сделать это:

for i in * 
do 
    mv -- "$i" ~ 
done 

или просто

mv -- * ~ 
+0

@ mklement0 Упс, верно, не знаю, как я пропустил это, учитывая, что вопрос был конкретно о именах файлов с пробелами :) Отредактировано. – Doorknob

+0

Это работает, если вы хотите запускать команды в файлах в текущей директории, но я должен перечислить все файлы в одном каталоге и сравнить имена файлов с некоторыми текстовыми файлами ......., поэтому хранение в списке может стать необходимым и каталог также не может быть текущим каталогом. Также, если я попробую s = («Hello world»), каждое слово будет считаться отдельной записью. Как сохранить предложение в списке за одну запись? – user40647

+1

Это будет _still_ сбой, если у вас есть имя файла, начинающееся с '-'. используйте 'mv - * ~' – mata

2

Если вы должны, dirfiles=(/path/of/interest/*).

И принять предупреждение против разбора вывода ls!

Я понимаю, что вы новичок в этом, и я хотел бы помочь. Но мне нелегко (мы?) Предоставить вам ответ, который будет вам очень полезен, как вы изложили свой вопрос.

Основываясь на том, что я слышу до сих пор, вы, похоже, не понимаете, как работают расширения параметров в оболочке. Следующие две ссылки будут полезны вам: Matching Pathnames, Parameters

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