2012-03-25 92 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 – 2012-03-25 18:03:48

+0

然後我的問題變成了「如何創建指向到/ tmp /文件夾的符號鏈接的文件名的數組」 - 這可能是一個更復雜的問題。但是由於我們在/ proc /目錄中,所有的文件名都是簡單的整數,所以我們可以毫不費力地解析'ls'。 – 2012-03-25 18:07:47

回答

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,它不允許我管道輸出到另一個命令正確(因爲它不''''回聲'之前'),但它的作品。 – 2012-03-25 18:35:32

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