많은 파일의 내용 표시


19

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

./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의 조합으로 가능해야한다고 생각하지만, 방법을 알지 못했습니다. 시간 내 줘서 고마워!


답변:


29

두 개의 표준 명령 headtail파일 이름이 둘 이상의 파일 인수를 전달하면 파일 이름으로 헤더를 인쇄합니다. 전체 파일을 인쇄하려면 tail -n +1(첫 번째 줄부터 인쇄하십시오. 모든 것).

여기에서 이름이 점으로 시작하는 단일 파일을 제외한 모든 파일을 보려는 것처럼 보입니다. 도트 파일은 유닉스에서“숨겨져”있습니다. 기본 출력 ls이나 와일드 카드 일치에 나타나지 않습니다 . 숨겨지지 않은 모든 파일을 일치시키는 것은 단지로 수행됩니다 *.

tail -n +1 *

( tail -n +1 -- *파일 이름 중 하나가로 시작하는 경우 엄밀히 말하면 필요합니다 -.)


짧고 달콤한, 감사합니다! --수정 자 에 대해 어디에서 읽을 수 있는지 알고 있습니까?
Znarkus

2
@Znarkus : --옵션의 끝을 나타내는 것은 대부분의 명령이 따르는 규칙입니다. 예를 tail -n +1 -- -f -g알려줍니다 tail-f-g(피연산자)가 아닌 옵션을 읽을 파일입니다. POSIX 유틸리티 구문 가이드 라인 (유틸리티 작성자를위한 문서) 의 가이드 라인 10입니다 . 최종 사용자를위한 독서 제안이 없습니다. 좋은 유닉스 튜토리얼이 어느 시점에서 그것을 다루기를 기대합니다.
Gilles

14

다음과 find같이 한 번에 모두 할 수 있습니다 .

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

즉 말한다 find모든 파일 (찾을 -type f현재 디렉토리 (인치) .(제외) -not라는 이름의) 한 .htaccess( -name .htaccess). 그런 다음 -printf줄 바꿈 뒤에 파일 이름 ( %p)을 인쇄 ( ) 한 다음 파일 ( )에서 실행 cat합니다 -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 {} \+

다른 하나는 더 짧았으므로 받아 들였습니다. 훌륭한 답변이지만 감사합니다!
Znarkus

6

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

grep -vI "\x00" -- *

비슷하지만 재귀 적으로 :

grep -vIr "\x00" -- .

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

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

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

사이드 노트 :

  • \x00위의 예제에서 NUL ( )을 사용하면 바이너리 파일이 표시되지 않습니다 ( -I실제로 수행하지만 여전히 일부 패턴을 사용해야 함).
  • 와일드 카드 ( *)를 사용하면와 같은 숨겨진 파일을 자동으로 무시합니다 .htaccess.

참조 : GREP : 디스플레이 파일 이름 한 번, 다음 줄 번호와 컨텍스트를 표시 유닉스 SE에서


2
보통 grep -r ^은 충분합니다.
catpnosis

2

이것을 사용할 수 있습니다 :

cat $(find Directory/ -not -name *.htaccess)

1

파이프를 사용하여 미세 조정하고 너무 많은 시간을 허비하지 않으려는 경우 찾기 및 모든 것 (가장 강력한 툴체인 임에도 불구하고)

for 루프, 고양이 등을 사용하십시오.


0

너무 인쇄하려면 재귀 적으로 사용하십시오 (예 : 확장자가 .sql 인 파일의 경우).

find -name "*.sql" -exec cat {} \; > all.sql
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.