2012-03-25 2 views
0

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

#!/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

http://mywiki.wooledge.org/ParsingLs –

+0

Тогда моя проблема становится «Как создать массив имен файлов симлинок указывающих в/TMP/папку» - которая, вероятно, гораздо более сложная задача. Но поскольку мы находимся в каталоге/proc/directories, все имена файлов будут простыми целыми числами, поэтому мы можем без труда проанализировать 'ls'. –

ответ

0

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

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

Это не отказоустойчивый вовсе (разборе выход ls вообще нет).

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

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

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

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

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

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

+0

Хорошие ответы, я использую цикл с readlink, это не позволяет мне правильно передать вывод в другую команду (потому что это не 'cd'ing перед' echo'ing), но он работает. –

0

Это обрабатывает несколько строк вывода от 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 
Смежные вопросы