ls -li
ディレクトリで作業を実行すると、次のような結果が出るとします。
12353538 -rw-r--r-- 6 me me 1650 2013-01-10 16:33 fun.txt
出力に示すように、ファイルはfun.txt持つ6ハードリンクは次のとおりです。12353538。
ファイル内のすべてのハードリンク(つまり、同じinode番号を持つファイル)を見つける方法は?
答え1
基本的な前提は、次のものを使用することです。
find /mount/point -mount -samefile /mount/point/your/file
システムからfindmnt
次のようにマウントポイントをエクスポートできます。
file=/path/to/your/file
find "$(findmnt -o TARGET -cenT "$file")" -mount -samefile "$file"
ターゲットファイルがそのファイルシステムにない限り、検索しないことが重要です。/
なぜなら、inode番号はマウントされたすべてのファイルシステムで再利用されるからです。
答え2
inode番号がすでに存在する場合は、find-inum
オプションを使用できます。
find /mount/point -xdev -inum 12353538
(一部のfind
実装ではこれを標準としてのみサポートしていますが、対応-mount
する機能もサポートしています。)-xdev
-xdev
答え3
ffind
~から探偵キット削除されたファイル名を含む特定のinodeのすべてのファイル名を見つけることができます。
たとえば、
sudo ffind -a /dev/sda3 $(stat --format=%i ~/just_a_test)
生産する
* /home/me/empty_1
* /home/me/hard_link_to_empty1
/home/me/just_a_test
/home/me/hard_link_to_just_a_test
アスタリスクのあるエントリは、存在しなくなった古いファイル名です(ファイルの名前が変更または削除されたため)。
$(stat --format=%i ~/just_a_test)
ファイルのinodeを取得するために使用しています。
プログラムでファイル名のパーティションを取得するには(/dev/sda3
前の例では)、次を使用できます。df
:
file=~/just_a_test; sudo ffind -a $(df -P "$file" | awk 'END{print $1}') $(stat --format=%i "$file")
答え4
前回答ありがとうございます。
バイナリはstat
inodeだけでなく、そのデバイスのマウントポイントも提供できます。以下のコードスニペットでは、これを使用して「一般的な」ユースケースを解決します。
fn_hardlinks() {
declare target; target="$1" && shift
[ ! -e "$target" ] && \
{ echo "[error] invalid target: '$target'" 1>&2; exit 1; }
stat '/' 2>/dev/null 1>&2 || \
{ echo "[error] no functioning 'stat' binary found'" 1>&2; exit 1; }
declare mount; mount="$(stat -c '%m' "$target")"
declare inode; inode="$(stat -c '%i' "$target")"
[ "x${mount[-1]}" != "x/" ] && mount+="/"
find "$mount" -xdev -inum "$inode" 2>/dev/null
}
alias hardlinks=fn_hardlinks
そして、以下を実行してください:
> hardlinks ./resources/sphinx/gitinfo.py
/home/user/build/z-documentation/resources/sphinx/gitinfo.py
/home/user/build/sphinx-gitinfo/git/sphinx-gitinfo/gitinfo.py
PS:注exit
vsはreturn
使用方法によって異なります!