私はcshellで次のエイリアスを試しています。
alias sll 'ls -l \!* | grep -oE '[^ ]+$' | paste -s | xargs ls -l'
この CSH 表現の変数名が正しくありません。
を使用すると、エイリアスは\$
エラーなしで設定されます。ただし、このエイリアスを使用すると、次のような結果が得られます。grep: Invalid regular expression
添付:
- このエイリアスの目的は、
ls -Ll <filenames>
ファイルのフルパスを介してシンボリックリンク参照を有効にすることです。 - エイリアスの RHS 部分は、スタンドアロン命令でうまく機能します。
- 代わりにegrep(grep -E)を試しました
awk '{print $NF}'
。それにもかかわらず、CSHはエラー:NF未定義変数を提供します。
答え1
一重引用符を確認してください。一重引用符は魔法のようにネストされません。
alias sll 'ls -l \!* | grep -oE '\''[^ ]+$'\'' | xargs ls -ld --'
これは、次のようないくつかの理由でまだ欠陥があります。
- その後、
[^ ]
スペースを含むファイルまたはリンク先の名前には機能しません。 - リストを行リストとして処理すると、改行文字を含むファイル/リンク宛先名には機能しません。
- そのため、
xargs
アポストロフィ、バックスラッシュ、二重引用符、その他の種類のスペースを含むファイル/ターゲット名には機能しません。 - シンボリックリンクの場合比較的パスをターゲットとして指定すると、現在のディレクトリのシンボリックリンクに対してのみ機能します。 2番目のディレクトリに渡すのは現在のディレクトリへの相対パスであり、シンボリックリンクはシンボリックリンクファイルのパスに基づいて確認されるためです(リンク
ls
がある場合)。a/b/c -> d
つまり、現在のディレクトリa/b/d
ではありません)。d
- 出力の最初の行は
total <n>
誤ったエラーメッセージを表示しますls
。 - シンボリックリンクへのシンボリックリンクの場合、同じ結果は得られません
ls -lL
(おそらくこれが望むものかもしれません)。
これにより、zsh
次のことができます。
ls -ld -- *(:A)
修飾子は:A
シンボリックリンクを標準の絶対パスに拡張します。
GNUシステムと準同等:
readlink -fz -- * | xargs -r0 ls -ld --