Shell
如何找到文件所在的設備(並在腳本中使用)?
我想找出我的文件在哪個設備上,以便我可以在腳本中使用它。我可以做到這一點:
$ df . Filesystem 512-blocks Used Available Capacity Mounted on /dev/disk0s2 498438976 294369520 203557456 60% /
但是這個輸出感覺太笨拙了;有沒有比解析這個更好的方法來獲取第二行的第一個“單詞”?
我真正需要的是這樣的東西,所以我可以將它傳遞給下一個命令:
$ somecommand . /dev/disk0s2
我怎樣才能做到這一點,最好不求助於字元串破解“df”輸出?
您可以單獨使用 shell(適用於
bash
,dash
,ksh
,zsh
):df . | (read a; read a b; echo "$a")
或者如果不需要輸出(結果將保存在 $a 中)並且您的 shell 支持程序替換(如
bash
,zsh
):{ read; read a b;}< <(df .)
以下是與其他解決方案速度的一些比較:
# pure shell solution 1 bash-4.2$ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null 1.899 (dash) $ time -f '%e' dash -c 'for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null' 1.05 (ksh) $ time for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null 0m1.16s real 0m0.02s user 0m0.12s system (zsh) manatwork% time (for i in $(seq 500); do df . | (read a; read a b; echo "$a"); done > /dev/null) 1.51s # pure shell solution 2 bash-4.2$ time for i in $(seq 500); do { read; read a b;}< <(df .); done 1.192 (zsh) manatwork% time (for i in $(seq 500); do { read; read a b;}< <(df .); done) 3.51s # other solutions bash-4.2$ time for i in $(seq 500); do df . | tail -1 | cut -f 1 -d " "; done > /dev/null 1.405 bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null 5.407 bash-4.2$ time for i in $(seq 500); do df . | sed -n '2{s/ .*$//;p}'; done > /dev/null 1.767 bash-4.2$ time for i in $(seq 500); do df . | sed '2!d' | awk '{print $1}'; done > /dev/null 3.334 bash-4.2$ time for i in $(seq 500); do df . | gawk 'NR==2{print $1}'; done > /dev/null 3.013 bash-4.2$ time for i in $(seq 500); do df . | mawk 'NR==2{print $1}'; done > /dev/null 1.747 bash-4.2$ time for i in $(seq 500); do df . | perl -nae 'print$F[0]if$.==2'; done > /dev/null 2.752
(不與
stat
解決方案相比,因為它在這裡不起作用。)