ls -l

2012-03-25 13 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にはそれらがなく、たとえそれがあっても構文を知らないでしょう。

出力を1行ごとに分割して、それぞれから[8]の値をエコーし​​ますか?

+2

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

+0

その後、私の問題が「どのように/ tmp /フォルダを指すシンボリックリンクのファイル名の配列を作成するには」 - おそらくはるかに複雑な問題です。しかし、私たちは/ proc /ディレクトリに入っているので、すべてのファイル名は単純な整数になりますので、 'ls'をあまり問題なく解析できます。 –

答えて

0

あなたはこのためにawkを使用することができます。

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

これは、すべてのフェイルセーフではありません(一般lsの出力を解析することはできません)。

あなたfindが、それは次のようになりサポートしている場合は、より安全なアプローチ:

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

(ファイル名にスペースがある場合はまだ安全ではありません。)

これはかなり堅牢で、あなたにはbashを与える必要がありますarrayブートへ:

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

は(まだ\nが含まれているファイル名で失敗します。)

+0

良い答え、私はreadlinkでループを使用していますが、出力を別のコマンドに正しくパイプすることはできません( 'echo'ingの前に' cd 'していないので)。 –

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 
関連する問題