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

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

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

4b9b3361

Ответ 1

Чтобы ответить на ваш точный вопрос, используйте следующее:

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 -exec, если script несколько прост, или вы можете сделать цикл над тем, что поиск возвращает так:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)

Ответ 2

for i in `ls`; do echo $i; done;

не может быть проще, чем это!

edit: hmm - по мнению Денниса Уильямсона, похоже, вы можете!

edit 2: хотя OP специально спрашивает, как анализировать вывод ls, я просто хотел указать, что, как говорили комментаторы ниже, правильный ответ - "вы не делаете". Используйте for i in * или подобное.

Ответ 3

Фактически вам не нужно использовать ls/find для файлов в текущем каталоге.

Просто используйте цикл for:

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

И если вы хотите также обрабатывать скрытые файлы, вы можете установить относительный параметр:

shopt -s dotglob

Эта последняя команда работает только в bash.

Ответ 4

В зависимости от того, что вы хотите сделать, вы можете использовать xargs:

ls directory | xargs cp -v dir2

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