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

StackOverflow https://stackoverflow.com/questions/4678418

Вопрос

Нужно обрабатывать файлы в текущем каталоге по одному. Я ищу способ взять результаты 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

Однако, если вы просто хотите обрабатывать файлы по одному, вы можете либо использовать findS. -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

Например. Ксаргс будет действовать на каждом возвращенном элементе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top