Как захватить вывод из команды LS или найти команду для хранения всех имен файлов в массиве?
Вопрос
Нужно обрабатывать файлы в текущем каталоге по одному. Я ищу способ взять результаты ls
или же find
и хранить полученную ценность как элементы массива. Таким образом, я могу манипулировать элементами массива по мере необходимости.
Решение
Чтобы ответить на ваш точный вопрос, используйте следующее:
arr=( $(find /path/to/toplevel/dir -type f) )
Пример
$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt
Однако, если вы просто хотите обрабатывать файлы по одному, вы можете либо использовать find
S. -exec
Опция, если сценарий несколько проста, или вы можете сделать петлю над тем, что находит, возвращает так:
while IFS= read -r -d $'\0' file; do
# stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)
Другие советы
for i in `ls`; do echo $i; done;
Не могу стать проще!
РЕДАКТИРОВАТЬ: Хм - согласно комментарию Денниса Уильямсона, кажется, что вы можете!
Редактировать 2: Хотя ОП специально спрашивает, как проанализировать вывод ls
, Я просто хотел отметить, что, как сказали в комментаторах ниже, правильный ответ: «Ты не». Использовать for i in *
или подобно вместо этого.
На самом деле вам не нужно использовать LS/Find для файлов в текущем каталоге.
Просто используйте для петли:
for files in *; do
if [ -f "$files" ]; then
# do something
fi
done
И если вы хотите обработать скрытые файлы, вы можете установить относительную опцию:
shopt -s dotglob
Эта последняя команда работает только в Bash.
В зависимости от того, что вы хотите сделать, вы можете использовать XARG:
ls directory | xargs cp -v dir2
Например. Ксаргс будет действовать на каждом возвращенном элементе.