wc -l을 통해 xargs의 각 배치를 파이프합니다.

wc -l을 통해 xargs의 각 배치를 파이프합니다.

그래서 내 임무는 가장 하드 링크가 있는 디렉토리에서 파일을 찾는 것입니다. 지금까지 나는 다음을 가지고 있습니다 :

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 {} +

관련 정보