別のファイルシステム上のディレクトリをどのように識別しますか?

別のファイルシステム上のディレクトリをどのように識別しますか?

私がディレクトリ(たとえば/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もっと面倒ですが、これらの制限はありません。

関連情報