2016-09-26 8 views
0

Bashでは、簡単な方法で列を取得し、値に対してbashコマンドを実行してから、結果を新しい列として追加しますか?Bash:コマンドに基づいて列を追加する

単純な(そして工夫された)例として、現在のディレクトリ内のシンボリックリンクのリストと、それらがポイントするターゲットが必要です。 awkの等価は次のようなものかもしれません:

ls | awk '{ "readlink -f "$1 | getline target; print $1, target }' 

しかし、それは一口です。私はこの作業のために明示的にツールデザインを好むだろう。 xargsに似て何か:

ls | add-column readlink -f 

、出力は次のようになります。

A.txt /path/to/A.txt 
B.txt /path/to/B.txt 

、このようなツールが存在しますか?それは改行でファイル名を扱うことができる-print0を持っているので、

find -mindepth 1 -maxdepth 1 -type l -print0 | 
    while IFS= read -r -d '' file; do 
     printf "%s\t%s\n" "$file" "$(readlink -- "$file")" 
    done | column -t -s $'\t' 

注私はfind代わりのlsを使用しています:シンプルwhileループを使用することについてどのように

+0

「ls」でこれを使用することを文字通り*意味しないことを願います。これはいくつかの理由で悪い考えです。 [ParsingLs](http://mywiki.wooledge.org/ParsingLs)を参照してください。 –

+0

私は意図的に '工作物'と言っていることに注意してください。 – Nycto

答えて

0

。また、シンボリックリンクやターゲットにタブが含まれている場合、正しい出力書式が生成されません。

+0

ここで 'echo -e'を使うのは悪いフォームです。リテラルであるバックスラッシュとそれに続くリテラル' t'が含まれていれば、 。 (また、[[echo'のPOSIXの定義](http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html)では、 '-e'をまったく利用する必要はありません。代わりにいくつかのオプションのフラグ、環境変数[コンパイル時のオプション](https://www.gnu.org/software/bash/manual/)があればbashでも利用できません。 html_node/Optional-Features.html)が有効になっています。 –

+0

@CharlesDuffyそうです、私はそれを 'printf'に変更しました。 – redneb

1

それはアンダースコアではなくダッシュ(in function namesをサポートする「ポータブル文字セットのアンダースコア、数字、英字」relevant POSIX standard保証のみ)を使用するには、名前のために安全なのですけれども、簡単に行わ:

add_column() { 
    while IFS= read -r line; do 
    printf '%s\t%s\n' "$line" "$("[email protected]" "$line")" 
    done 
} 

ls -1 | add_column readlink -f -- 

output of ls is not suitable for programmatic useに注意してください。したがって、この特定の例はちょうどそのようなものです - 例 - のみです。

関連する問題