Pokaż zawartość wielu plików


19

Jaki jest najłatwiejszy sposób na wyświetlenie zawartości wielu plików z wiersza poleceń ? Mój katalog wygląda jak poniżej.

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

Teraz chciałbym wyświetlić zawartość wszystkich plików oprócz .htaccess. Może wyglądać mniej więcej tak:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Myślę, że powinno to być możliwe dzięki kombinacji find, xargs i cat, ale nie wiem, jak to zrobić. Dziękuję za Twój czas!


Odpowiedzi:


30

Dwa standardowe polecenia headi tailwypisz nagłówek z nazwą pliku, jeśli przekażesz im więcej niż jeden argument pliku. Aby wydrukować cały plik, użyj tail -n +1(drukuj od pierwszego wiersza, tzn. Wszystkiego).

Wygląda na to, że chcesz zobaczyć każdy plik oprócz jednego, którego nazwa zaczyna się od kropki. Pliki kropkowe są „ukryte” pod Uniksem: nie pojawiają się w domyślnym wyjściu lslub w dopasowaniu ze znakiem wieloznacznym. Tak więc dopasowywanie wszystkich nie ukrytych plików odbywa się za pomocą just *.

tail -n +1 *

(Ściśle mówiąc, tail -n +1 -- *jest potrzebny, jeśli jedna z nazw plików zaczyna się od a -.)


Krótko i słodko, dziękuję! Czy wiesz, gdzie mogę przeczytać o --modyfikatorze?
Znarkus

2
@Znarkus: --oznaczenie końca opcji jest konwencją, której przestrzega większość poleceń. Np. tail -n +1 -- -f -gMówi o tailtym -fi -gsą plikami do odczytu (operandy), a nie opcjami. Jest to wytyczna 10 w wytycznych dla składni narzędzi POSIX (dokument przeznaczony dla autorów programów narzędziowych). Nie mam propozycji czytania przeznaczonej dla użytkowników końcowych, w pewnym momencie spodziewałbym się, że obejrzy ją dobry samouczek unixowy.
Gilles „SO- przestań być zły”

Tylko uwaga, bo wiele innych odpowiedzi zaproponować użytku find, ale następnie użyć trochę Exec z formatowania wydruku: prosty sposób na wykorzystanie findi tailjest: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0i xargs -0i --upewnić się, że komenda działa również z nazwami plików ze spacjami lub zaczynając -)
IanH

14

Możesz to wszystko zrobić w jednym find:

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

To mówi, findaby znaleźć wszystkie pliki ( -type f) w bieżącym katalogu ( .) oprócz ( -not) jednego o nazwie .htaccess( -name .htaccess). Następnie wypisuje ( -printf) nowy wiersz, po którym następuje nazwa pliku ( %p), a następnie uruchamia catsię na pliku ( -exec cat {} \;). To da ci wynik jak:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Jeśli robisz to często, warto umieścić go w skrypcie powłoki lub funkcji; Mam taki, catsktóry robi dokładnie to:

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

Pętla nad każdym argumentem nazwy pliku, wypisuje nazwę pliku (pogrubioną zieloną czcionką), a następnie przechwytuje plik:

Przykładowy zrzut ekranu

Zatem polecenie będzie po prostu:

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

Drugi był krótszy, więc to zaakceptował. Doskonała odpowiedź, dziękuję!
Znarkus

6

Aby wyświetlić zawartość wszystkich plików w bieżącym folderze, spróbuj:

grep -vI "\x00" -- *

i podobne, ale rekurencyjnie:

grep -vIr "\x00" -- .

Format będzie: filename: content.

Aby mieć podobny format, jak sugerowano, byłby to:

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

Notatki dodatkowe:

  • Użycie NUL ( \x00) w powyższych przykładach zapobiega wyświetlaniu plików binarnych (co -Ifaktycznie działa, ale nadal musimy użyć jakiegoś wzorca).
  • Używając symboli wieloznacznych ( *), automatycznie ignoruje ukryte pliki, takie jak .htaccess.

Zobacz także: grep: wyświetl nazwę pliku jeden raz, a następnie wyświetl kontekst z numerami linii w Unix SE


2
Zwykle grep -r ^wystarczy.
catpnosis

2

Możesz użyć tego:

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

1

Jeśli chcesz precyzyjnie dostroić i nie tracić zbyt wiele czasu za pomocą rur, znajdź i wszystko (choć jest to najpotężniejszy łańcuch narzędzi, jaki możesz kiedykolwiek znaleźć)

po prostu spróbuj użyć pętli for, cat itp.


0

Jeśli chcesz też wydrukować, użyj go rekurencyjnie (na przykład w przypadku plików z rozszerzeniem .sql):

find -name "*.sql" -exec cat {} \; > all.sql
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.