Получить данные столбца из каждой строки вывода из ls -l - PullRequest
0 голосов
/ 25 марта 2012

У меня есть скрипт для определения флэш-файлов в памяти, которые будут скопированы или переданы в программу, такую ​​как vlc для воспроизведения.

#!/bin/bash
pid=($(ps aux | grep flash | grep -v grep | grep -v bin/flash))
cd "/proc/${pid[1]}/fd"
file=($(echo `ls -l  | grep /tmp/`))
file="${file[8]}"
echo "$file"

Это работает хорошо, но я хочу, чтобы он возвращал каждый соответствующий файл, так какон только возвращает первый.

Я бы обычно делал что-то вроде многомерного массива, но в bash его нет, и даже если бы он был, я бы не знал синтаксис.

Как разделить вывод по строке, а затем отобразить значение [8] для каждого?

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

Также обрабатывает несколько строк вывода из ps. Может быть, вы можете иметь более одного процесса Flash?

#!/bin/sh
for pid in $(ps aux | awk '/[f]lash/ && !/bin\/[f]lash/{print $1}); do
    for file in /proc/$pid/fd/*; do
        case $(readlink "$file") in
            /tmp/*) echo "$file" ;;
         esac
    done
done
0 голосов
/ 25 марта 2012

Вы можете использовать awk для этого:

files=$(ls -l|awk -F"-> " '/\/tmp/{print $2}')

Это вовсе не отказоустойчиво (обычно синтаксический анализ ls не выполняется).

Более безопасный подходесли ваш find поддерживает, то это будет:

files=$(find . -type l -printf "%l\n")

(Все еще небезопасно, если в имени файла есть пробелы.)

Это должно быть довольно надежно и даст вам удар массив для загрузки:

IFS=$'\n' files=($(find . -type l -printf "%l\n"|grep /tmp))

(по-прежнему происходит ошибка с именами файлов, которые содержат \n.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...