Jeśli mam duży plik i muszę go podzielić na 100 megabajtów, zrobię to
split -b 100m myImage.iso
To zwykle daje mi coś takiego
xaa
xab
xac
xad
I żeby je z powrotem połączyć, używałem
cat x* > myImage.iso
Wydaje się, że powinien istnieć bardziej wydajny sposób niż czytanie każdego wiersza kodu w grupie plików cat
i przekierowywanie danych wyjściowych do nowego pliku. Jak sposób na otwarcie dwóch plików, usunięcie EOF
znacznika z pierwszego i połączenie ich - bez konieczności przeglądania całej zawartości.
Windows / DOS ma polecenie kopiowania plików binarnych. Pomoc wspomina, że to polecenie zostało zaprojektowane tak, aby móc łączyć wiele plików. Działa z tą składnią: ( /b
dotyczy trybu binarnego)
copy /b file1 + file2 + file3 outputfile
Czy istnieje coś podobnego lub lepszy sposób łączenia dużych plików w systemie Linux niż cat?
Aktualizacja
Wygląda na cat
to, że jest to właściwy sposób i najlepszy sposób łączenia plików. Cieszę się, że przez cały czas używałem właściwego polecenia :) Dziękujemy wszystkim za opinie.
cat x*
, ponieważ kolejność plików zależy od ustawień regionalnych. Lepiej zacznij pisaćcat x
, niż naciśnij Esc, a następnie*
- zobaczysz rozszerzoną kolejność plików i możesz zmienić kolejność.cat x*
możesz rozważyć rozszerzenie nawiasów klamrowych,cat xa{a..g}
które rozszerza określoną sekwencję docat
xaa xab xac xad xae xaf xagcat x*
? Czy nowe ustawienie regionalne nie wpływa równieżsplit
tak, że jeślisplit
icat x*
były używane w tym samym systemie będą zawsze działa?split.c
w GNU Coreutils, przyrostki są zbudowane ze stałej tablicy znaków:static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";
. Ustawienia regionalne nie będą miały wpływu na przyrostek. (Ale nie sądzę, że jakikolwiek rozsądny lokalny porządek zmieniłby małe litery; nawet EBCDIC zachowuje ich standardową kolejność.)Odpowiedzi:
Właśnie po to
cat
został stworzony. Ponieważ jest to jedno z najstarszych narzędzi GNU, myślę, że jest mało prawdopodobne, aby jakiekolwiek inne narzędzie działało tak szybciej / lepiej. I to nie jest potokowanie - to tylko przekierowanie wyjścia.źródło
cat x, then press Esc
Trik wspomniałeś jest schludny .. Szukałem czegoś takiego, dzięki ... dobry komentarz i dobra odpowiedźCtrl+W
wyciąć słowo, a następnieCtrl+Y
wkleić je.Pod maską
Nie ma bardziej wydajnego sposobu niż skopiowanie pierwszego pliku, a następnie skopiowanie drugiego pliku po nim i tak dalej. Zarówno DOS, jak
copy
icat
zrób to.Każdy plik jest przechowywany niezależnie od innych plików na dysku. Prawie każdy system plików zaprojektowany do przechowywania danych na urządzeniu podobnym do dysku działa blokowo. Oto bardzo uproszczona prezentacja tego, co się dzieje: dysk jest podzielony na bloki, powiedzmy 1kB, a dla każdego pliku system operacyjny przechowuje listę bloków, które go tworzą. Większość plików nie ma całkowitej liczby bloków, więc ostatni blok jest tylko częściowo zajęty. W praktyce systemy plików mają wiele optymalizacji, takich jak współdzielenie ostatniego częściowego bloku między kilkoma plikami lub przechowywanie „bloków 46798 do 47913” zamiast „bloku 46798, bloku 46799,…”. Gdy system operacyjny musi utworzyć nowy plik, szuka wolnych bloków. Bloki nie muszą być następujące po sobie: jeśli tylko bloki 4, 5, 98 i 178 są wolne, nadal możesz przechowywać plik 4kB.
Możesz obsługiwać częściowe bloki w środkowym pliku, ale zwiększyłoby to złożoność, szczególnie w przypadku niesekwencyjnego uzyskiwania dostępu do plików: aby przejść do 10340 bajtu, nie można już przeskoczyć do 100 bajtu 11 bloku, musisz mieć aby sprawdzić długość każdego interweniującego bloku.
Biorąc pod uwagę użycie bloków, nie można po prostu połączyć dwóch plików, ponieważ ogólnie pierwszy plik kończy się w połowie bloku. Jasne, możesz mieć specjalny przypadek, ale tylko wtedy, gdy chcesz usunąć oba pliki podczas konkatenacji. Byłoby to bardzo specyficzne postępowanie w przypadku rzadkich operacji. Taka specjalna obsługa nie działa sama, ponieważ w typowym systemie plików dostęp do wielu plików jest uzyskiwany jednocześnie. Więc jeśli chcesz dodać optymalizację, musisz dokładnie przemyśleć: co się stanie, jeśli jakiś inny proces odczyta jeden z zaangażowanych plików? Co się stanie, jeśli ktoś spróbuje połączyć A i B, gdy ktoś będzie konkatenował A i C? I tak dalej. Podsumowując, ta rzadka optymalizacja byłaby ogromnym obciążeniem.
Podsumowując, nie można uczynić łączenia plików bardziej wydajnymi bez większych poświęceń gdzie indziej. To nie jest tego warte.
Na podział i łączenie
split
icat
są prostymi sposobami dzielenia i łączenia plików.split
zajmuje się tworzeniem plików o nazwach uporządkowanych alfabetycznie, dzięki czemucat *
działa przy łączeniu.Minusem
cat
łączenia jest to, że nie jest odporny na typowe tryby awarii. Jeśli jeden z plików jest obcięty lub brakuje go,cat
nie będzie narzekać, po prostu otrzymasz uszkodzony wynik.Istnieją narzędzia do kompresji, które tworzą archiwa wieloczęściowe, takie jak
zipsplit
irar -v
. Nie są one bardzo uniksowe, ponieważ kompresują i pakują (składają wiele plików w jeden) oprócz dzielenia (i odwrotnie rozpakowują i dekompresują oprócz łączenia). Ale są przydatne, ponieważ sprawdzają, czy masz wszystkie części i że części są kompletne.źródło
Tyle że tak naprawdę to się nie dzieje. Powłoka łączy stdout
cat
bezpośrednio z otwartym plikiem, co oznacza, że „przejście przez stdout” jest tym samym, co zapis na dysk.źródło
cat
. Dziękujemy za poinformowanie mnie o bezpośrednim połączeniu.Kiedyś miałem dokładnie ten problem: chciałem dołączyć do niektórych plików, ale nie miałem wystarczająco dużo miejsca na dysku, aby pomieścić je podwójnie.
Napisałem więc kilka programów:
To pozwoliło mi zrobić coś takiego
i tym samym usuwając plik źródłowy, gdy 128M był jeszcze niepisany. Trochę niebezpieczne, ale jeśli dane nie są tak cenne lub istnieją również gdzie indziej, jest to wykonalne.
W razie potrzeby mogę podać źródło.
źródło
Technicznie rzecz biorąc, jest to sposób na uzyskanie dostępu do całego pliku bez konieczności odczytywania i zapisywania całej zawartości, i może być przydatny w przypadku dużych plików lub jeśli pozostało mało miejsca:
A następnie użyj
myImage.iso
na przykładChociaż oczywiście
myImage.iso
jest to specjalny plik (nazwany potok), a nie zwykły plik, więc może się przydać lub nie, w zależności od tego, co próbujesz zrobić.źródło
Podział plików
Podziel według rozmiaru
Jeśli chcesz podzielić duży plik na małe pliki i wybrać nazwę i rozmiar małych plików wyjściowych, tak właśnie jest.
W ten sposób decydujesz się podzielić jeden duży plik na mniejsze części o pojemności 500 MB. Chcesz również, aby nazwy plików części były SmallFile. Zauważ, że potrzebujesz kropki po nazwie pliku. Wynikiem powinno być wygenerowanie nowych plików takich jak ten:
Podziel według liczby linii
W ten sposób podzielisz plik tekstowy na mniejsze pliki ograniczone do 50 linii.
Wynik powinien być mniej więcej taki:
Podziel według bajtów
Podziel na małe pliki o niestandardowym rozmiarze małych plików w bajtach:
Wynik powinien być podobny do wyniku z podziału według liczby linii .
Dołączanie plików
Możesz łączyć pliki na dwa sposoby. Pierwszy to:
lub z:
Uwaga: podczas łączenia plików małe pliki nie powinny być uszkodzone. Również wszystkie małe (częściowe) pliki powinny znajdować się w tym samym katalogu.
źródło