여러 파일의 내용 표시

여러 파일의 내용 표시

명령줄에서,여러 파일의 내용을 표시하는 가장 쉬운 방법은 무엇입니까?내 디렉토리는 아래와 같습니다.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

이제 다음과 같이 보고 싶습니다 .htaccess.

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

내 생각에는 이것이 find, xargs 및 cat의 조합으로 가능해야 한다고 생각하지만 아직 방법을 찾지 못했습니다. 시간 내 주셔서 감사합니다!

답변1

여러 파일 인수가 표준 head명령 및 일부 구현 에 전달되면 tail(POSIX는 tail0 또는 1개의 파일 인수만 허용) 파일 이름이 포함된 헤더가 인쇄됩니다. 전체 파일을 인쇄하려면 tail -n +1(첫 번째 줄부터 인쇄, 즉 모든 항목을 인쇄)를 사용하세요.

여기에서는 이름이 점으로 시작하는 단일 파일을 제외한 모든 파일을 보려고 하는 것 같습니다. 도트 파일은 유닉스에서 "숨겨져 있습니다". 기본 출력 ls이나 와일드카드 일치 에는 표시되지 않습니다 . 따라서 숨겨지지 않은 모든 파일을 일치시키려면 *.

tail -n +1 -- *

또는 tail여러 인수를 받아들일 수 없는 경우:

head -n 999999 -- *

(일부 head -n -0 -- *이지만 표준도 아닙니다).

head/의 GNU 구현은 파일 이름만 주어진 경우에도 헤더가 인쇄되도록 / 옵션 tail도 허용합니다 .-v--verbose

--파일 이름 중 하나는 로 덮어야 합니다 -. /라는 파일은 -여전히 ​​stdin으로 처리됩니다. 을 사용하면 이 문제를 해결할 수 있지만 접두사가 출력 헤더에 포함된다는 의미입니다.headtail./*./

답변2

다음 방법으로 이 모든 작업을 한 번에 수행할 수 있습니다 find.

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

이는 ( ) 라는 이름의 파일( )을 제외하고 현재 디렉터리( ) 에서 모든 파일( )을 find찾는다는 의미입니다 . 그런 다음 개행 문자( )와 파일 이름( )을 인쇄한 다음 파일( ) 에서 실행됩니다 . 그러면 다음과 유사한 출력이 제공됩니다.-type f.-not.htaccess-name .htaccess-printf%pcat-exec cat {} \;

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

cats이 작업 을 자주 수행하는 경우 이를 쉘 스크립트나 함수에 넣는 것이 좋습니다.

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

각 파일 이름 매개변수를 반복하고 파일 이름(굵은 녹색으로 표시)을 인쇄한 다음 파일을 캡처합니다.

스크린샷 예시

그러면 명령은 다음과 같습니다.

$ find . -type f -not -name .htaccess -exec cats {} \+

답변3

현재 폴더에 있는 모든 파일의 내용을 표시하려면 다음을 시도하십시오.

grep -vI "\x00" -- *

유사하지만 재귀적입니다.

grep -vIr "\x00" -- .

형식은 다음과 같습니다 filename: content.

제안된 것과 유사한 형식을 가지려면 다음과 같습니다.

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

참고 사항:

  • 위의 예에서 NUL()을 사용하면 \x00바이너리가 표시되는 것을 방지할 수 있습니다( -I실제로는 그렇게 하지만 일부 패턴을 사용해야 합니다).
  • 와일드카드( *)를 사용하면 숨겨진 파일을 자동으로 무시합니다 .htaccess.

또한보십시오:grep: 파일 이름을 한 번 표시한 다음 줄 번호로 컨텍스트를 표시합니다.유닉스 SE에서

답변4

반복적으로 인쇄하려는 경우(예: .sql 확장자를 가진 파일의 경우):

find -name "*.sql" -exec cat {} \; > all.sql

관련 정보