Необходимо обрабатывать файлы в текущем каталоге по одному. Я ищу способ сделать вывод ls
или find
и сохранить результирующее значение как элементы массива. Таким образом, я могу манипулировать элементами массива по мере необходимости.
Как получить вывод из команды ls или find для хранения всех имен файлов в массиве?
Ответ 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 будут действовать на каждый возвращенный элемент.