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

Как обрабатывать результаты поиска в bash script?

Я пытаюсь использовать массив для хранения списка имен файлов с помощью команды find.

По какой-то причине массив не работает в bash, который используется в школе, но моя программа работает на моем собственном ноутбуке.

Итак, мне было интересно, есть ли другой способ сделать это, вот что у меня есть:

array = (`find . -name "*.txt"`)  #this will store all the .txt files into the array

Затем я могу получить доступ к элементам массива и сделать копии всех файлов с помощью команды cat.

Есть ли другой способ сделать это без использования массива?

4b9b3361

Ответ 1

Вы можете использовать что-то вроде этого:

find . -name '*.txt' | while read line; do
    echo "Processing file '$line'"
done

например. сделайте копию:

find . -name '*.txt' | while read line; do
    echo "Copying '$line' to /tmp"
    cp -- "$line" /tmp
done

НТН

Ответ 2

У меня возникла проблема с решением Johannes Weiß, если бы я просто выполнял эхо, это сработало бы для полного списка файлов. Однако, если я попытался запустить ffmpeg на следующей строке, script обработает только первый файл, с которым он столкнулся. Я предположил некоторые смешные дела IFS из-за трубы, но я не мог понять это и вместо этого работал с циклом for:

for i in $(find . -name '*.mov' ); 
do
    echo "$i"
done

Ответ 3

Просто не помещайте пробелы вокруг знака равенства:

ar=($(find . -name "*.txt"))

Избегайте обратных ссылок, если это возможно, поскольку они устарели. Их можно легко спутать с апострофом, особенно в бедных шрифтах, и они не так хорошо гнездятся.

В большинстве случаев вам будет лучше всего обслуживать, если вы выполните итерацию через результат поиска непосредственно с помощью -exec, -execdir, -ok или -okdir.

Для циклов while и while это трудно сделать правильно, когда дело доходит до пробелов в именах файлов или новых строк и вкладок.

find ./ -name "*.txt" -exec grep {} ";"

{} не требуется маскировка. Вы часто увидите комбинацию find/xargs, которая также запускает дополнительный процесс:

find ./ -name "*.txt" | xargs grep {} ";"

Ответ 4

find . -name '*.txt' | while IFS= read -r FILE; do
    echo "Copying $FILE.."
    cp "$FILE" /destination
done