すべての隠しファイルをリンクするためにtailを正しく使用する方法

すべての隠しファイルをリンクするためにtailを正しく使用する方法

質問

私は次のことができるようにしたいです。

  1. ディレクトリ(通常と非表示)のすべてのファイルをリンクします。
  2. しかし、各接続が開始されるたびに各ファイルのタイトルを表示したいと思います。

私は非常にきちんとしたトリックで#2を実行するためのいくつかのソリューションをオンラインで見つけましたが、これにはtail -n +1 * 2>/dev/null私がしたいのと同じファイルを隠すことは含まれていません。cat * .* 2>/dev/nullhead * .* 2>/dev/null

catコマンドはトリックを実行しますが、ファイル名は含まず、headコマンドは各ファイルの内容全体を印刷/接続しません。

質問

私がしなければならないことをする方法はありますかtailそうでなければ、同じ結果/出力を達成するための良い選択肢は何ですか?

アップデート例

すべてのファイル(通常のファイルと隠しファイル)をリンクしようとしたときのtailコマンド


[kevin@PC-Fedora tmp]$ ls -la
total 8
drwx------   2 user user 4096 Jun 23 09:24 .
drwxr-xr-x. 54 user user 4096 Jun 23 08:21 ..
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f1
-rw-rw-r--   1 user user    0 Jun 23 09:24 f1
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f2
-rw-rw-r--   1 user user    0 Jun 23 09:24 f2
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f3
-rw-rw-r--   1 user user    0 Jun 23 09:24 f3
-rw-rw-r--   1 user user    0 Jun 23 09:24 .f4
-rw-rw-r--   1 user user    0 Jun 23 09:24 f4
-rw-rw-r--   1 user user    0 Jun 23 09:24 f5
[user@PC-Fedora tmp]$ tail -n +1 *
==> f1 <==

==> f2 <==

==> f3 <==

==> f4 <==

==> f5 <==
[user@PC-Fedora tmp]$ tail -n +1 * .*
==> f1 <==

==> f2 <==

==> f3 <==

==> f4 <==

==> f5 <==

==> . <==
tail: error reading '.': Is a directory
[user@PC-Fedora tmp]$ 


答え1

zshGNUを使用するtail(すべてのtail実装が複数のファイル名引数を使用できるわけではなく、すべてがファイル名を表示するわけではありません):

() { (($# == 0)) || tail -vn +1 -- "$@" < /dev/null; } *(ND)

-vDdotglobの場合、Nnullglobの場合はglobの拡張子を渡し、現在のディレクトリが空であることを確認する匿名関数を使用して、ファイルが1つしかない場合でもファイル名が印刷され続ける特別なケースです。

</dev/nulltailGNUがという名前のファイルを渡すと、-代わりにstdinを読み取ることが部分的に軽減されます。ここではstdinを読み取ることを防ぎますが、まだというファイルを読みません-。 。"${@/#%-/./-}""$@"-./-==> ./- <====> - <==-==> standard input <==

制限するには、glob修飾子を追加.(または)する必要があります。-.定期的なこれは、現在のディレクトリ()にディレクトリまたは他の種類の非正規ファイルがある場合にのみエラーを防ぐか、より深刻な状況を防ぎます*(ND-.)

ksh93GNUと同じtail

(
  FIGNORE='@(.|..)'
  set -- ~(N)*
  (($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)

bashGNUと同じtail

(
  setopt -s nullglob dotglob
  set -- *
  (($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)

または、GNUtailとすべてのPOSIX sh(エミュレーションzshのみを含むsh)を使用して、通常のファイルまたは一般的なファイルへのシンボリックリンクに制限し、に置き換えますが、他のファイルの前にファイルを処理するため、-ファイル./-を別の順序で処理することもできます.*

(
  set --
  for file in .* *
    [ -f "$file" ] || continue
    [ "$file" = - ] && file=./-
    set -- "$@" "$file"
  done
  [ "$#" -eq 0 ] || exec tail -n +1 -- "$@"
)

またはGNUを使用できますawk(ここで使用されますzsh)。

() {
  (( $# == 0 )) ||
    gawk 'BEGINFILE{
            print sep "==> "substr(FILENAME, 3)" <=="
            sep = "\n"
          }
          {print}' "$@"
} *(ND-.)

awktailインクルードを使用すると、表示時-に削除されるプレフィックスを追加して=両方の問題を解決します。./ファイルの末尾に改行文字がない場合、awkは1つを追加します。

またはループを使用してください。

sep=
for f (*(ND-.)) {
  print -r "$sep==> $f <=="
  sep=$'\n'
  cat < $f
}

cat同じ問題があります-。引数の代わりにstdinにファイルを渡して解決しました。)

関連情報