여러 디렉터리의 파일에서 한 줄 인쇄

여러 디렉터리의 파일에서 한 줄 인쇄

나는 다음과 같은 작업을 수행합니다.

여러 사용자 디렉터리가 있습니다. 일부 사용자 디렉터리에는 이라는 폴더가 있습니다 myFolder. 이 같은:

/home/usera/a/b/myFolder
/home/userb/a/b/myFolder
/home/userc/a/b/
/home/userd/a/b/myFolder

myFolder홈 디렉토리에는 .net이 없습니다 userc.

myFolder라는 파일이 있습니다 README. 콘솔/파일에 사용자 이름과 함께 추가 정보의 두 번째 줄을 인쇄하고 싶습니다.

"sed"를 사용하려고 하는데 첫 번째 폴더의 출력이 표시됩니다. 예를 들어

sed '2!d' /home/*/a/b/myFolder/README

이 명령을 푸시할 수 있지만 예상한 결과가 나오지 않습니다. 내가 찾고 있는 이상적인 출력은 다음과 같습니다.

usera - v2.2
userb - v2.1
userd - v2.2

출력 형식을 유연하게 지정할 수 있습니다. 그러나 사용자 이름이 인쇄되어야 하며 README파일의 두 번째 줄을 읽을 수 있습니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?

답변1

awk이 지시어를 지원하는 구현을 사용하면 nextfile다음을 수행할 수 있습니다.

awk 'FNR == 2 {print; nextfile}' /home/*/a/b/myFolder/README

지원되지 않는 awk 구현과 함께 사용할 수도 있지만 nextfile파일 전체를 읽기 때문에 효율성이 떨어집니다.

주소가 전체 입력의 두 번째 줄이 아닌 각 파일의 두 번째 줄과 일치 sed하도록 하려면 GNU 구현 옵션이 필요합니다 .2-ssed

sed -s '2!d' /home/*/a/b/myFolder/README

그러나 이는 또한 모든 파일을 완전히 읽음을 의미하며 sedGNU에도 sedgawk nextfile또는 ' 와 perl동등한 기능이 없습니다 close ARGV.

그리고 perl:

perl -ne '
  if ($. == 2) {print; close ARGV} else {close ARGV if eof}
  ' /home/*/a/b/myFolder/README

사용자 이름 인쇄:

awk '
  FNR == 2 {
    split(FILENAME, f, "/")
    print f[3] ": " $0
    nextfile
  }' /home/*/a/b/myFolder/README
perl -ne '
  if ($. == 2) {
    print((split "/", $ARGV)[2] . ": $_");
    close ARGV;
  } else {
    close ARGV if eof;
  }' /home/*/a/b/myFolder/README

답변2

for folder in /home/*/a/b/myFolder; do
  if [ -f "$folder/README" ]; then
    version=$(sed '2!d' "$folder/README")
    username=$(basename $(dirname $(dirname $(dirname $folder) ) ) )
    echo "$username - $version"
 fi
done

이 문제를 해결하려면 공통 기본 디렉터리를 반복하여 사용자 이름에 대해 와일드카드를 사용하는 모든 사용자를 일치시키고 경로에 파일이 있는지 테스트한 다음 파일이 README있으면 파일에서 두 번째 줄을 추출한 다음 파일 경로 이름에 사용자가 있습니다.

답변3

찾기를 사용하면 파일을 찾고 각 파일에 대해 작업이나 명령을 수행할 수 있습니다.

find /home -path '/home/*/a/b/myFolder/README' -printf '%h - ' -exec sed '2!d' {} \;

관련 정보