我有一个脚本可以识别内存中的Flash文件,以便复制或传递给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]
值?
答案 0 :(得分: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
的文件名。)
答案 1 :(得分: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