그래서 내 임무는 가장 하드 링크가 있는 디렉토리에서 파일을 찾는 것입니다. 지금까지 나는 다음을 가지고 있습니다 :
find . -name "file*" | xargs -I{} -n 1 find . -samefile {}
이것은 나에게 다음을 제공합니다:
./hardlinkFIle245
./hardlinkFIle23
./hardlinkFIle2
./file2.txt
./hardlinkFIle1234
./hardlinkFIle123
./hardlinkFIle12
./hardlinkFIle1
./file1.txt
이제 이것을 파이프로 연결하면 |wc -l
총 행 수는 9가 됩니다.
find . -name "file*" | xargs -I{} -n 1 find . -samefile {} | wc -l
내가 원하는 것은 각 xargs 배치 -n 1 에 대해 개수를 제공하는 것입니다. 그래서 나는 다음을 원합니다.
4
5
답변1
GNU를 사용한다면 find
링크 수를 보고하도록 할 수 있습니다 -printf %n
. 따라서 다음을 통해 최대값을 얻을 수 있습니다.
find . -name 'file*' -printf '%n\n' | sort -rn | head -n1
.
그러나 숫자에는 패턴과 일치하지 않는 항목 아래에 없는 링크가 포함될 수 있습니다 file*
.
file*
아래에서 발견된 명명된 하드 링크 수를 세고 .
해당 경로를 보려면 다음을 수행할 수 있습니다.
find . -name 'file*' -printf '%i\0%p\0' | gawk -v RS='\0' '
{
inode = $0
getline file
}
++count[inode] >= max {
files[inode] = files[inode] " - " file ORS
max = count[inode]
max_inode = inode
}
END {
printf "%s", "File with most links ("max"):\n" files[max_inode]
}'
find
파일당 한 번이 아닌 호출을 한 번만 실행합니다 .
답변2
각 xargs에 새 쉘을 생성할 수 있습니다.
find . -name "file*" | xargs -n 1 sh -c 'echo "$1"; find . -samefile "$1" | wc -l' xargs-sh
xargs
파일 경로에 문자를 인용하는 공백이 포함되어 있으면 깨질 수 있으므로 여기서 사용하는 것은 좋지 않습니다 .
여기서도 wc -l
파일 경로에 개행 문자가 포함되어 있으면 깨지기 때문에 사용법이 취약합니다.
표준 구문을 사용하고 루프를 사용하면 find -exec cmd {} +
파일당 하나씩 실행하는 수고를 덜 수 있습니다.sh
find . -name "file*" -exec sh -c '
for file do
printf "%s\n" "$file"
find .//. -samefile "$file" | grep -c //
done' find-sh {} +