質問
私は次のことができるようにしたいです。
- ディレクトリ(通常と非表示)のすべてのファイルをリンクします。
- しかし、各接続が開始されるたびに各ファイルのタイトルを表示したいと思います。
私は非常にきちんとしたトリックで#2を実行するためのいくつかのソリューションをオンラインで見つけましたが、これにはtail -n +1 * 2>/dev/null
私がしたいのと同じファイルを隠すことは含まれていません。cat * .* 2>/dev/null
head * .* 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
zsh
GNUを使用するtail
(すべてのtail実装が複数のファイル名引数を使用できるわけではなく、すべてがファイル名を表示するわけではありません):
() { (($# == 0)) || tail -vn +1 -- "$@" < /dev/null; } *(ND)
-v
D
dotglobの場合、N
nullglobの場合はglobの拡張子を渡し、現在のディレクトリが空であることを確認する匿名関数を使用して、ファイルが1つしかない場合でもファイル名が印刷され続ける特別なケースです。
</dev/null
tail
GNUがという名前のファイルを渡すと、-
代わりにstdinを読み取ることが部分的に軽減されます。ここではstdinを読み取ることを防ぎますが、まだというファイルを読みません-
。 。"${@/#%-/./-}"
"$@"
-
./-
==> ./- <==
==> - <==
-
==> standard input <==
制限するには、glob修飾子を追加.
(または)する必要があります。-.
定期的なこれは、現在のディレクトリ()にディレクトリまたは他の種類の非正規ファイルがある場合にのみエラーを防ぐか、より深刻な状況を防ぎます*(ND-.)
。
ksh93
GNUと同じtail
:
(
FIGNORE='@(.|..)'
set -- ~(N)*
(($# == 0)) || tail -vn +1 -- "$@" < /dev/null
)
bash
GNUと同じ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-.)
awk
tail
インクルードを使用すると、表示時-
に削除されるプレフィックスを追加して=
両方の問題を解決します。./
ファイルの末尾に改行文字がない場合、awkは1つを追加します。
またはループを使用してください。
sep=
for f (*(ND-.)) {
print -r "$sep==> $f <=="
sep=$'\n'
cat < $f
}
(cat
同じ問題があります-
。引数の代わりにstdinにファイルを渡して解決しました。)