カスタム列を使用してlsコマンドを拡張する方法

カスタム列を使用してlsコマンドを拡張する方法

ls -lカスタム列でコマンドを変更できるかどうか疑問に思います。

たとえば、この列に$(CustomCommand FILE)

答え1

これは非常に基本的な概念証明です。特に強力ではありませんが(たとえば、空白のあるファイル名は壊れる可能性があります)、アイデアを得ます。

$ export CustomCommand=file
$ alias ls=/tmp/test/myls
$ ls
a  b  c  myls
$ ls -l
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 a a: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 b b: empty
-rw-rw-r-- 1 steve steve   0 Sep 22 19:17 c c: empty
-rwxr-xr-x 1 steve steve 127 Sep 22 19:18 myls myls: POSIX shell script,     ASCII text executable
$ cat /tmp/test/myls
#!/bin/sh
if [ "$1" = "-l" ]
then
 shift
 ls -l $* | awk 'NF>2{ printf "%s ",$0 ; system("$CustomCommand " $NF) }'
else
 ls $*
fi
$

答え2

Paste、sed、lsを組み合わせてbashrcに保存する方法です。これには2つの主要部分があります。

  • ここで、「custom_command」はパラメータを受け入れますが、渡された各パラメータに「YYY」を追加し、「ZZZ」を追加します。 OPの実際のCustomCommandだけでなく、他のタスクも実行します。
  • custom_command への呼び出しを含む「ls1」というエイリアス。私たちはまだ「ls」に依存しているので、「ls」との競合を避けるために「ls1」という名前を付けます。

したがって、~/.bashrcに以下を追加してください。

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}

alias ls1='paste <( ls -lh | sed 1d ) <( custom_command * )'

次に、. ~/.bashrc現在の端末に適用するようにします。

現在のディレクトリに 'dir1' 'file1' 'file2' と 'file 3' (空白のファイルテスト) が含まれている場合は、エイリアスを実行して次のことをls1確認できます。

$ ls1
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

説明する

custom_command ()
{
    for i; do
        echo "YYY${i}ZZZ"
    done
}
  • 何も指定しないと、for iforループは位置引数を使用します。
  • i 変数を区別するには中かっこが必要です。それ以外の場合、bashは$ iZZZを変数として誤って解釈します。

出力例:

$ custom_command a b c
YYYaZZZ
YYYbZZZ
YYYcZZZ

*Bash拡張で使用する場合:

$ custom_command *
YYYdir1ZZZ
YYYfile1ZZZ
YYYfile2ZZZ
YYYfile 3ZZZ

"ls -lh"は通常、次のことを行います。

$ ls -lh
total 16K
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

sedを使用してください。 1 は行 1 を意味し、d は削除を意味し、最初の行を削除します。

$ ls -lh | sed 1d
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3

手続き的pasteおよびプロセス置換は、これらの別々<(...)の出力を組み合わせるための鍵です。 Pasteには通常、ファイルが引数として必要ですpaste data1 data2。たとえば、bashのプロセスオーバーライドを使用するため、コマンドの出力は利用可能な一般ファイルとして表示されます。

$ paste <( ls -lh | sed 1d ) <( custom_command * )
drwxr-xr-x 2 meme meme 4.0K Sep 22 14:33 dir1   YYYdir1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file1  YYYfile1ZZZ
-rw-r--r-- 1 meme meme    8 Sep 22 13:51 file2  YYYfile2ZZZ
-rw-r--r-- 1 meme meme   14 Sep 22 15:45 file 3 YYYfile 3ZZZ

bashrcを使用してこのコマンドを保存すると、新しい. ~/.bashrc端末または再ロードバスを実行している既存の端末で簡単に再利用できます。

関連情報