it-swarm.com.ru

Сохраните вывод команды find в массиве

Как поместить результат find $1 в массив?

В течение цикла:

for /f "delims=/" %%G in ('find $1') do %%G | cut -d\/ -f6-
10
Gábor Varga

Я хочу плакать.

В Баш:

 file_list=()
 while IFS= read -d $'\0' -r file ; do
     file_list=("${file_list[@]}" "$file")
 done < <(find "$1" -print0)

 echo "${file_list[@]}"

file_list теперь массив, содержащий результаты find "$1

Что особенного в «поле 6»? Непонятно, что вы пытались сделать с помощью команды cut

Хотите вырезать каждый файл после 6-го каталога?

for file in "${file_list[@]}" ; do
    echo "$file" | cut -d/ -f6-
done

Но почему «поле 6»? Могу ли я предположить, что вы действительно хотите вернуть только последний элемент пути?

for file in "${file_list[@]}" ; do
    echo "${file##*/}"
done

Или даже

echo "${file_list[@]##*/}"

Который даст вам последний элемент пути для каждого пути в массиве. Вы могли бы даже сделать что-то с результатом

for file in "${file_list[@]##*/}" ; do
    echo "$file"
done

Объяснение элементов программы bash:

(Возможно, вместо этого следует использовать встроенную readarray)

find "$1" -print0

Найдите материал и «напечатайте полное имя файла на стандартном выводе с последующим нулевым символом». Это важно, так как мы позже разделим этот вывод на нулевой символ.

<(find "$1" -print0)

«Подстановка процесса»: выходные данные подпроцесса find считываются через FIFO (т. Е. Выходные данные подпроцесса find ведут себя здесь как файл)

while ... 
done < <(find "$1" -print0)

Вывод подпроцесса find читается командой while через <

IFS= read -d $'\0' -r file

Это условие пока:

read

Прочитайте одну строку ввода (из команды find). Возвращаемое значение read равно 0, если только не встречается EOF, и в этот момент происходит выход.

-d $'\0'

... принимая в качестве разделителя нулевой символ (см. Цитирование на странице руководства bash). Что сделано, потому что мы использовали нулевой символ, используя -print0 ранее.

-r

обратная косая черта не считается escape-символом, так как она может быть частью имени файла

file

Результат (фактически первое слово, которое здесь уникально) помещается в переменную file

IFS= 

Команда запускается с IFS, специальной переменной, которая содержит символы, по которым read разбивает ввод на слова unset. Потому что мы не хотим разделяться.

И внутри цикла:

file_list=("${file_list[@]}" "$file")

Внутри цикла массив file_list только что вырос на $file, соответствующим образом заключенный в кавычки.

56
Sorpigal
arrayname=( $(find $1) )

Я не понимаю ваш вопрос о петле? Если вы посмотрите, как работать с этим массивом, то в bash вы можете просмотреть все элементы массива следующим образом:

for element in $(seq 0 $((${#arrayname[@]} - 1)))
do
        echo "${arrayname[$element]}"
done
10
Cougar

Вот более простая бессистемная версия, основанная на версии user2618594

declare -a names=$(echo "("; find <path> <other options> -printf '"%p" '; echo ")")
for nm in "${names[@]}"
do
    echo "$nm"
done
1
R Risack

Вероятно, это не на 100% надежно, но, вероятно, будет работать 99% времени (я использовал утилиты GNU; утилиты BSD не будут работать без изменений; также, это было сделано с использованием файловой системы ext4):

declare -a BASH_ARRAY_VARIABLE=$(find <path> <other options> -print0 | sed -e 's/\x0$//' | awk -F'\0' 'BEGIN { printf "("; } { for (i = 1; i <= NF; i++) { printf "%c"gensub(/"/, "\\\\\"", "g", $i)"%c ", 34, 34; } } END { printf ")"; }')

Тогда вы бы перебрали его так:

for FIND_PATH in "${BASH_ARRAY_VARIABLE[@]}"; do echo "$FIND_PATH"; done

Убедитесь, что заключили $ FIND_PATH в двойные кавычки при работе с путем.

1
user2618594