私がディレクトリ(たとえば/mnt
)にあると想像してください。そのうちのいくつかは他のファイルシステムのマウントポイントであり、他のディレクトリは同じファイルシステムの正当なディレクトリです。 2つのディレクトリを区別できるように、現在のディレクトリの内容を一覧表示する簡単なコマンドを実行できますか?
1つの可能性は、tree -L 1 -x
同じファイルシステム内の対応するフォルダのみを拡張することです。ただし、そのフォルダがすべて空の場合(つまり、空のファイルシステムがマウントポイントにマウントされ、正当なディレクトリが空のディレクトリの場合)は機能しません。 。
(ここで実際のユースケースはbtrfsファイルシステムで、どのディレクトリがサブボリュームであり、どのディレクトリではないかを簡単に識別できます。)
編集する:友達からこれを使用してdf
各ファイルのマウントポイントをインポートしたら、次のコマンドを実行して他のファイルシステムのすべてのフォルダを一覧表示できることを提案しました。
comm -1 -3 \
<(df --output=target . | sort) \
<(df --output=target * | sort | uniq) |
xargs basename -a
このコマンドはマウントポイントを取得するためにすべてのファイルに対して実行され、df
現在のディレクトリから出力を削除して(ヘッダーも削除され)、各ファイルのデフォルト名を取得します。df
しかし、これは特にエレガントではなく壊れやすいです(少なくとも改行のため、おそらく私が何かを見落としているからかもしれません)。もっと良い方法がありますか?
答え1
私はこれを使用しますdf
。
$ cd /usr
$ ls
X11R6 include libexec mdec sbin xobj
bin lib local obj share xsrc
games libdata lost+found ports src
$ for d in *; do test -d "$d" && df -P "$d" | awk -v d="$d" 'FNR>1{print d,$NF}'; done
X11R6 /usr
bin /usr
games /usr
include /usr
lib /usr
libdata /usr
libexec /usr
local /usr/local
lost+found /usr
mdec /usr
obj /usr
ports /usr/ports
sbin /usr
share /usr
src /usr
xobj /usr
xsrc /usr
答え2
そして統計資料(*が非常に大きいものに拡張されると、ARG_MAXがオーバーフローする可能性があります):
stat -c '%D %n' */ | awk -v no=$(stat -c %D /) ' $1 != no { print $2 }'
そして探す:
find . -mindepth 1 -maxdepth 1 -type d -printf '%D\t%P\n' |grep -v "^$(stat -c%d /)" |cut -f2
答え3
Linuxでは、次のものを使用できます。stat
マウントされた各ファイルシステムに関連付けられた一意の識別子をリストします。
stat -f -c %i somefile
たとえば、現在のディレクトリのマウントポイントを一覧表示するには(ファイル名に改行がないと仮定)、次のようにします。
stat -f -c '%i %n' * | grep -v "^$(stat -f -c %i .)"
zshでは利用可能ですzsh/stat
基準寸法。ロードしてzmodload zsh/stat
から
zstat +device *
現在のディレクトリのマウントポイントを一覧表示します。
zstat +device * | grep -v " $(zstat +device .)"
または
print -rl -- *(e\''[[ $(zstat +device $REPLY) == '$(zstat +device .)' ]]'\')
たとえば、同じネットワーク共有を別の場所にマウントしたり、Linuxバインドマウントを使用したりする場合など、同じファイルシステムのさまざまなビューに対してファイルシステム識別子が同じです。ただし、btrfs サブボリュームには独自の識別子があります。出力の解析df
もっと面倒ですが、これらの制限はありません。