"ls -al"コマンド出力からハードリンクの数を削除します。

"ls -al"コマンド出力からハードリンクの数を削除します。

ls -al以下はコマンドの出力です。

total 280K
drwxrwxr-x 2 enan enan 4.0K Jun 28 09:59 ranger/
drwxrwxr-x 2 enan enan 4.0K Jun  8 23:26 scripts/
-rw-rw-r-- 1 enan enan   49 Jun  4 18:19 caps_to_ctrl.sh
-rw-rw-r-- 1 enan enan  739 Jun  4 18:19 cmus.theme
-rw-rw-r-- 1 enan enan 8.6K Jun  4 18:19 compton.conf
-rw-rw-r-- 1 enan enan 5.9K Jun 22 09:39 config
-rw-rw-r-- 1 enan enan  859 Jun 14 12:13 i3blocks.conf
-rw-rw-r-- 1 enan enan 4.7K Jun 14 12:13 init.el
-rw-rw-r-- 1 enan enan 8.7K Jun 28 11:22 init.vim
-rw-rw-r-- 1 enan enan  815 Jun 14 12:13 install.sh
-rwxrwxr-x 1 enan enan  142 Jun  4 18:19 lock.sh*
-rw-rw-r-- 1 enan enan 1.1K Jun 21 13:30 README.md
-rw-rw-r-- 1 enan enan 197K Jun 14 12:13 screenshot.png
-rw-rw-r-- 1 enan enan 1.2K Jun 20 21:51 Session.vim
-rw-rw-r-- 1 enan enan  427 Jun  9 13:46 tmux.sh

-rw-rw-r--ファイル権限とファイル所有者の間に数字があることがわかりますenan。この番号はファイルへのハードリンクの数です。場合によっては、それを出力に表示するのが便利かもしれませんが、今は必要ではなく、時々注意が気を散らします。ls -al今は不要なので、出力から最後の変更日を削除する方法があることがわかります。

それでは、ls -alコマンド出力からハードリンク数をどのように削除できますか?コマンド出力にハードリンクの数と最後の変更日を表示するのはなぜ重要ですか?私は、あなたがこの情報を使用している人がいる場合は、その理由と方法を教えてください。なぜなら、私が使うべき動作を誤ってあいまいにしたくないからです。

答え1

2列目のリンクを見たくない場合は、パイプls -alで接続してくださいawk

ls -al | awk '{$2=""; print $0}'

これにより、標準の区切り文字(この場合はスペース)を使用して、2番目の列を除くすべての列が印刷されます。

私の環境では、最後の変更日の列は6、7、8であり、スペースを区切り文字として使用してその列と2番目の列を削除できます。

ls -la | awk '{$2=$6=$7=$8=""; print $0}'

特定の列が必要ない場合や表示したい場合は、上記の構文をモデルとして使用して目的の列を削除できます。何も痛くないでしょう。すべての列を見て何も見逃したくない場合は、次の基準を使用してください。

ls -al

エイリアスが必要な場合は、~/.bashrc に以下を追加します。

la() {
    ls -la | awk '{$2=$6=$7=$8=""; print $0}'
}

この関数は、一重引用符と二重引用符を考慮したりエスケープしたりすることなく、同じように機能します。laasを使用すると、ll構文エラーが発生します。なぜなら、私の環境ではすでにエイリアスだからです。

答え2

ls -l残りの行はそのまま維持しながら、出力からハードリンク数を削除するには、次の手順を実行します。

ls -l | sed -E '2,$s/ +[0-9]+//'

置換は、sed最初の行の後の各行の最初の数値セットとその前のすべてのスペース(最初の行を含むtotal)を削除します。

関数として

myls () {
    command ls -l "$@" | sed -E '2,$s/ +[0-9]+//'
}

この関数は、結果を送信する前にls -lユーザーが関数に提供する追加のコマンドライン引数を使用して呼び出されますsed

を使用すると、command ls後で関数名を変更することにした場合に、ls関数が自分自身を再帰的に呼び出さないようにすることができます。

例:

$ ls -la ~/.skel
total 18
drwxr-xr-x  2 kk    wheel  512 May  4 16:29 .
drwxr-xr-x  3 kk    wheel  512 Jun 28 08:15 ..
-rw-r--r--  1 kk    wheel   87 Nov  1  2017 .Xdefaults
-rw-r--r--  1 kk    wheel  771 Feb  9 10:18 .cshrc
-rw-r--r--  1 kk    wheel  101 Nov  1  2017 .cvsrc
-rw-r--r--  1 kk    wheel  359 Nov  1  2017 .login
-rw-r--r--  1 kk    wheel  175 Nov  1  2017 .mailrc
-rw-r--r--  1 kk    wheel  229 May  4 16:29 .profile
-rw-r--r--  1 kk    wheel  108 Apr 15 12:50 .vimrc
-rw-r--r--  1 kk    wheel    0 Apr 21 17:44 .zshrc

$ myls -a ~/.skel
total
drwxr-xr-x  kk    wheel  512 May  4 16:29 .
drwxr-xr-x  kk    wheel  512 Jun 28 08:15 ..
-rw-r--r--  kk    wheel   87 Nov  1  2017 .Xdefaults
-rw-r--r--  kk    wheel  771 Feb  9 10:18 .cshrc
-rw-r--r--  kk    wheel  101 Nov  1  2017 .cvsrc
-rw-r--r--  kk    wheel  359 Nov  1  2017 .login
-rw-r--r--  kk    wheel  175 Nov  1  2017 .mailrc
-rw-r--r--  kk    wheel  229 May  4 16:29 .profile
-rw-r--r--  kk    wheel  108 Apr 15 12:50 .vimrc
-rw-r--r--  kk    wheel    0 Apr 21 17:44 .zshrc

アクション関数の変形正確にls以下を使用しない限り、次のようになりますls -l

ls () (
    add_filter=0
    while getopts ':l' opt; do
        case $opt in
            l)  add_filter=1 ;;
            1)  add_filter=0
        esac
    done

    command ls "$@" | 
    if [ "$add_filter" -eq 1 ]; then
        sed -E '2,$s/ +[0-9]+//'
    else
        cat
    fi
)

-lこの関数は、オプションが使用されたかどうかを検出するために独自のコマンドライン解析を実行します(後でオプションを使用して無効にすることはできません)。もしそうなら、私たちはフラグを設定します。後でフラグが設定されると、フィルタリングされた-1出力が渡されます。フラグが設定されていない場合は、出力をそのまま渡します。lssedcat

答え3

ast-open(ksh93が含まれていて前にある場合は組み込み関数でもありますls)を使用すると、出力形式を完全に指定してリンク数を省略できます()。ls/opt/ast/bin/bin$PATH%3(nlink)u

ls -rSZ '%(mode)s %-8(uid)s %-8(gid)s %8(device:case::%(size)u:*:%(device)s)s %(atime)s %(name)s%(linkop:case:?*: %(linkop)s %(linkpath)s)s'

関連情報