Chcę skopiować zawartość pięciu plików do jednego pliku bez zmian. Próbowałem to zrobić, używając cp dla każdego pliku. Ale to nadpisuje zawartość skopiowaną z poprzedniego pliku. Ja też próbowałem
paste -d "\n" 1.txt 0.txt
i to nie zadziałało.
Chcę, aby mój skrypt dodawał nową linię na końcu każdego pliku tekstowego.
na przykład. Pliki 1.txt, 2.txt, 3.txt. Umieść zawartość 1, 2, 3 w 0. txt
Jak mam to zrobić ?
Odpowiedzi:
Potrzebujesz polecenia
cat
(skrót od concatenate) z przekierowaniem powłoki (>
) do pliku wyjściowegoźródło
>>
aby dołączyć jeden plik do drugiego, gdzie>
nadpisuje plik wyjściowy tym, co jest do niego skierowane. A jeśli chodzi o znak nowej linii, czy istnieje znak nowej linii jako pierwszy znak w pliku1.txt
? Możesz się tego dowiedzieć, używającod -c
i sprawdzając, czy pierwsza postać to\n
.{...}
dopasowywania nazw plików, więc może cudzysłowy trochę pomieszały w twoim skrypcie? Zawsze staram się pracować z takimi rzeczami, używającls
powłoki. Kiedy dobrze wykonuję polecenie, po prostu wycinam je i wklejam do skryptu, tak jak jest. Ta-x
opcja może być również przydatna w skryptach - przed wykonaniem wyświetli ona rozwinięte polecenia w skrypcie.Inną opcją dla tych z Was, którzy nadal natkną się na ten post, tak jak ja, jest użycie
find -exec
:W moim przypadku potrzebowałem bardziej niezawodnej opcji, która przeglądałaby wiele podkatalogów, więc zdecydowałem się użyć
find
. Rozbijając to:Zajrzyj do bieżącego katalogu roboczego.
Interesują mnie tylko pliki, a nie katalogi itp.
Zmniejsz wynik ustawiony według nazwy
Wykonaj polecenie cat dla każdego wyniku. „+” oznacza, że
cat
zostało utworzone tylko 1 wystąpienie (thx @gniourf_gniourf)Jak wyjaśniono w innych odpowiedziach, dołącz zawartość kategorii na końcu pliku wyjściowego.
źródło
*.txt
musi być cytowany (w przeciwnym razie całefind
polecenie, tak jak napisano, jest bezużyteczne). Kolejna wada wynika z rażącego nieporozumienia: polecenie, które jest wykonywane, to niecat >> 0.txt {}
, alecat {}
. Twoje polecenie jest w rzeczywistości równoważne z{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(dodałem grupowanie, abyś wiedział, co się naprawdę dzieje). Inną wadą jest to, żefind
znajdzie plik0.txt
icat
będzie narzekać, mówiąc, że plik wejściowy jest plikiem wyjściowym .>> output.file
na końcu swoje polecenie, aby nikogo (w tym siebie) nie skłonić do myślenia, żefind
zostanie wykonanycat {} >> output.file
dla każdego znalezionego pliku.-exec cat {} +
zamiast-exec cat {} \;
, tak aby tylko jedna instancjacat
była tworzona z kilkoma argumentami (+
jest określona przez POSIX ).find . -type f -exec cat {} + >> outputfile.txt
i nie mogłem zrozumieć, dlaczego mój plik wyjściowy nie przestał rosnąć w koncerty, mimo że katalog miał tylko 50 megabajtów. To dlatego, że ciągle dołączałem do siebie plik outputfile.txt! Więc po prostu upewnij się, że nazwa tego pliku jest poprawna lub umieść go całkowicie w innym katalogu, aby tego uniknąć.jeśli masz określony typ wyjścia, zrób coś takiego
źródło
file_1
,,file_2
…file_11
, Ze względu na naturalną kolejność sortowania plików.Jeśli wszystkie twoje pliki znajdują się w jednym katalogu, możesz po prostu to zrobić
cat * > 0.txt
Pliki 1.txt, 2.txt, .. przejdą do 0.txt
źródło
file_1
,,file_2
…file_11
, Ze względu na naturalną kolejność sortowania plików.Znalazłem tę stronę, ponieważ potrzebowałem połączyć razem 952 plików w jeden. Okazało się, że działa to znacznie lepiej, jeśli masz wiele plików. Spowoduje to wykonanie pętli dla dowolnej liczby liczb, których potrzebujesz, i umieszczenie każdej z nich za pomocą >>, aby dołączyć do końca 0.txt.
źródło
Jeśli wszystkie twoje pliki mają podobne nazwy, możesz po prostu zrobić:
źródło
Inną opcją jest
sed
:Lub...
Lub...
Lub bez przekierowania ...
Zauważ, że ostatnia linia również
merge.txt
(niewmerge.txt
!) Możesz użyć,w"merge.txt"
aby uniknąć pomyłki z nazwą pliku i-n
do cichego wyjścia.Oczywiście możesz również skrócić listę plików za pomocą symboli wieloznacznych. Na przykład w przypadku plików numerowanych, jak w powyższych przykładach, zakres nawiasów można określić w następujący sposób:
źródło
jeśli twoje pliki zawierają nagłówki i chcesz je usunąć z pliku wyjściowego, możesz użyć:
źródło
Jeśli oryginalny plik zawiera znaki niedrukowalne, zostaną one utracone podczas korzystania z polecenia cat. Używając „cat -v”, elementy niedrukowalne zostaną przekonwertowane na widoczne ciągi znaków, ale plik wyjściowy nadal nie będzie zawierał rzeczywistych znaków niedrukowalnych w oryginalnym pliku. Przy małej liczbie plików alternatywą może być otwarcie pierwszego pliku w edytorze (np. Vim), który obsługuje znaki niedrukowalne. Następnie przejdź do końca pliku i wpisz „: r nazwa_drugi_pliku”. Spowoduje to pobranie drugiego pliku, w tym znaków niedrukowalnych. To samo można zrobić dla dodatkowych plików. Po wczytaniu wszystkich plików wpisz „: w”. W rezultacie pierwszy plik będzie teraz zawierał to, co robił pierwotnie, oraz zawartość plików, które zostały wczytane.
źródło
Jeśli chcesz dołączyć zawartość 3 plików do jednego pliku, dobrym wyborem będzie następujące polecenie:
Połączy zawartość wszystkich plików w plik4, zrzucając dane wyjściowe konsoli do
/dev/null
.źródło