Jak dołączyć do plików tekstowych?

21

Zapisałem wiele dokumentów jako txt. Chcę je wydrukować razem, więc najpierw chcę je razem w jednym pliku. W tym przypadku kolejność nie ma znaczenia.

Chcę rozwiązania, które nie wymaga wpisania nazw plików do scalenia, ale takiego, które po prostu scaliłoby wszystkie pliki txt w folderze.

Czy mogę to zrobić za pomocą polecenia lub GUI?


Spojrzałem tutaj . Nie wiem jak korzystać join.


źródło

Odpowiedzi:

43

Użyj catz przekierowaniem wyjścia. Składnia: cat file [file] [[file] ...] > joined-file.

Przykład z tylko dwoma plikami (możesz mieć ich znacznie więcej):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Jeśli masz „wiele dokumentów”, skorzystaj z globowania powłoki (wzorców):

cat input-files-dir/* > joined-file

Spowoduje to połączenie wszystkich plików w tym katalogu z bieżącym katalogiem (zapobiegając dopasowaniu go do samego pliku wyjściowego). Jest całkowicie niezależny od używania cati przekierowywania danych wyjściowych - to po prostu Bash podający wszystkie pliki jako argumenty cat.


Typy plików

Po prostu sklei (połączy) pliki razem, tak jak w przypadku papieru i taśmy. Nie obchodzi go faktyczny format pliku, który może to obsłużyć. Będzie działał dla plików tekstowych, ale nie dla plików PDF, ODT itp. Cóż, sklei je ze sobą, ale nie jest już prawidłowym plikiem PDF / ODT.


Kolejność dołączenia

Jak zauważył phoibos, globbing powłoki spowoduje alfabetyczny porządek nazw plików. Tak działa globowanie powłoki i powłoki.


Dodatek o input file is output filebłędzie

Gdy wzorzec plików wejściowych pasuje do tego samego pliku co plik wyjściowy, spowoduje to błąd. To funkcja bezpieczeństwa. Przykład: cat *.txt > out.txturuchom drugi raz spowoduje to.

Co możesz z tym zrobić:

  • Wybierz bardziej szczegółowy wzorzec pasujący do rzeczywistych plików wejściowych, niepasujący do nazwy wyjściowej. Przykład: wzorzec plików wejściowych *.txtz plikiem wyjściowym output.outnie koliduje.
  • Pracuj w różnych katalogach. W powyższym przykładzie użyłem osobnego input-files-dirkatalogu do umieszczenia wszystkich plików i wyprowadzenia ich do bieżącego katalogu roboczego. To uniemożliwia uzyskanie tego błędu.
gertvdijk
źródło
@cipricus Tak, ale to bardzo podstawowe globowanie powłoki (wzorce). Wypróbuj swoje wzorce, używając lstylko listy pasujących elementów. Np. ls *.txtAby zobaczyć, co jest dopasowane.
gertvdijk
2
@cipricus Co powiesz na cat * .txt> JoinedFile.txt?
Sadi
1
W rzeczywistości jest to bardziej rozsądne: cat najpierw łapie wszystkie pliki .txt, a następnie dołącza do nich, a po trzecie tworzy nowy plik .txt, którego nie można złapać na pierwszym etapie ;-)
Sadi
1
@cipricus Po prostu łączy pliki. Tak jak przy użyciu kawałków papieru z klejem i taśmą! Większość formatów plików „dokumentów”, takich jak PDF, które są skompresowane, nie pozwala na to. Użyj edytora PDF. Ale w każdym razie twoje pytanie dotyczyło plików tekstowych .
gertvdijk
1
W pełni rozumiem, że proponowana metoda (tworzenie podkatalogu, przenoszenie plików, a następnie łączenie) może być lepszym sposobem w niektórych przypadkach. Ale jeśli chcemy tylko dołączyć wszystkie pliki tekstowe (wszystkie z rozszerzeniem .txt) w bieżącym katalogu cat * .txt> JoinedFile.txt wykonuje to zadanie idealnie. Właśnie przetestowałem to z ciekawości i działa, i wydaje się, że Cipricus również znalazł ten sam wynik. (A system zaczął narzekać, że nie powinno się tutaj na czacie, w przeciwnym razie chciałbym zapytać, czy można nauczyć tego nowicjusza, jak można użyć formatowania w tych komentarzach bez paska ;-)
Sadi
12

Prostym sposobem na to jest użycie cat:

cat file1 file2 > joined_file

Jeśli tylko cat file1 file2wydasz, zobaczysz oba pliki na standardowym wyjściu. Za pomocą >przekierowujesz standardowe wyjście do pliku. Będzie to działać również z innymi poleceniami.

Jorge Suárez de Lis
źródło
Proszę przeczytać pytanie. Mówisz, aby określić poszczególne nazwy plików, których OP nie chciał zrobić!
Sri
2
Nie było tego w pierwotnym pytaniu. Nie zaktualizowałem mojej odpowiedzi, ponieważ pojawiły się bardziej kompletne odpowiedzi.
Jorge Suárez de Lis
@ JorgeSuárezdeLis Chociaż ta odpowiedź nie pomaga OP bezpośrednio w jego pytaniu, pamiętaj, że ta odpowiedź prawdopodobnie pomoże komuś, kto ma tylko kilka plików, które chciałby scalić. (oh hej, jak ja! dziękuję! ^ - ^) +1
Souta
@ JorgeSuárezdeLis Rzeczywiście. Odpowiedziałeś doskonale na wersję 2 pytania. Kilka minut później, wersja 3 , zmienił wymagania dotyczące odpowiedzi.
gertvdijk
5

Zrób to za pomocą prostej pętli:

for i in *.txt; do cat "$i" >> complete.txt; done

>> dołącza się do pliku.

Uwaga: jeśli z jakiegoś powodu musisz ponownie uruchomić polecenie, musisz je usunąć complete.txt, w przeciwnym razie zapisujesz plik do siebie, co nie działa.

phoibos
źródło
5
To również zadziała, ale nie widzę potrzeby stosowania pętli for, jeśli możesz użyć argumentów cat.
gertvdijk
1
Tak, oczywiście masz rację. Po prostu nie jestem pewien, czy używasz kolejności sordów cat *.txt. Pętla for powinna zostać posortowana.
phoibos
1
Okazuje się, że * gwarantowana jest kolejność alfabetyczna .
phoibos
Tak, to dokładnie to samo globowanie powłoki. Nie ma znaczenia, czy używasz go forw Bash, czy gdziekolwiek indziej.
gertvdijk
4

Jeśli pliki, które chcesz połączyć wszystkie, kończą się na .txt, to uprość:

cat *.txt > combined.txt

Jeśli katalog zawiera tylko pliki tekstowe, jest to również proste:

cat * > combined.txt

(Pamiętaj, że po utworzeniu combined.txt, powtórzenie tego spowoduje włączenie go do rozszerzenia *, co prowadzi do dziwnych zachowań).

Jeśli chcesz wybrać niektóre pliki w katalogu, a nie inne, najlepiej, jeśli nazwy plików pozwalają rozróżnić, które chcesz. Jeśli nie, możesz się podoba find. Ale wątpię, żebyś posunął się tak daleko.

Alexis
źródło
dzięki. jeśli spojrzysz na komentarze do zaakceptowanej odpowiedzi, Sadi zasugerował dokładnie to w komentarzu. Gdyby twoja odpowiedź była pierwsza, potrzebowałbym twojej. spójrz też na moje: dodał, że w niestandardowym menu
Dzięki za opinie. Tak, teraz to widzę, to było trochę zasłonięte ...
Alexis
4

Skrypt niestandardowego działania Thunar napisany przez Cipricusa również zainspirował mnie do napisania podobnego skryptu Nautilus i pomyślałem, że może być przydatny dla innych osób, które szukają odpowiedzi na te pytania w tym temacie. Oto on:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"
Sadi
źródło
@David Foerster Dzięki za edycję. Nie miałem żadnych problemów ze starą wersją (z moimi ograniczonymi przypadkami testowymi) i nie widzę też żadnego problemu z tą ulepszoną wersją. Przepraszamy, jeśli spowodowałem niedogodności z powodu usterki w poprzedniej wersji.
Sadi,
Nie był wadliwy, ale zawierał niepotrzebną pętlę, co utrudniało zrozumienie kodu, imho.
David Foerster,
2

Jest to uzupełnienie i odmiana innych odpowiedzi związanych z wdrożeniem tych rozwiązań w działaniach niestandardowych Thunara.

Nie wszystkie z nich są użyteczne w ten sposób, ale niektóre są.

Pomyślałem, że najciekawsze byłoby połączenie wybranych plików z menu kontekstowego Thunara .

Jest to odmiana od tego, co zostało zasugerowane przez Sadi w komentarzu do gertvdijk jest odpowiedź :

   cat %N > JoinedFile

Dołączone zostaną tylko wybrane pliki. Ogranicz warunki wyglądu do plików tekstowych.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj


Specjalne podziękowania dla Sadi, którego komentarz zapewnił mi najbardziej jasne i aktualne rozwiązanie mojego problemu.

Przyjąłem gertvdijk „s odpowiedź za ostateczne. Nie tylko była to okazja do komentarza Sadi, ale wydaje się, że ma ona dodatkową wartość dla innych, zapewniając dobrze uzasadnione i kompletne rozwiązanie (choć nieco powyżej moich umiejętności czytania w CLI).

Społeczność
źródło
2

Możesz także spróbować wykonać findpolecenie,

find . -name "*.txt" -type f -exec cat {} + > file

Znajduje .txtpliki w bieżącym katalogu i wykonuje catpolecenie na każdym założonym pliku. W końcu całe wyjście zostało przekierowane do nazwy pliku file(utworzonego bezpośrednio w samym nurcie).

Wyjaśnienie:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.
Avinash Raj
źródło
-2

Możesz także skorzystać z narzędzia online, takiego jak merge-files-online.com

StackMan
źródło