Jak to zrobić, plik docelowy nie jest Twoją własnością i musisz używać sudo?
Bijay Rungta
1
@BijayRungta: Wygląda na to, że odpowiedziałeś na własne pytanie. Wstępnie oczekiwałeś sudona catpolecenie (i wprowadź poświadczenia, jeśli zostaniesz o to poproszony).
David
musisz ... chmod 777 / etc / default / docker, aby dać sobie uprawnienia do zapisu na tym pliku - pamiętaj, aby przywrócić stare uprawnienia do pliku po
zakończeniu
1
@ Sigur: Chyba że istnieje sposób, aby skierować wyjście do dwóch plików jednocześnie, wymagałoby to dwóch wywołań polecenia.
David
2
@Sigur lub spojrzeć w teeprogramie: cat 1 | tee -a 2 3. Możesz umieścić tyle plików, ile chcesz po przełączeniu --append(lub -aw skrócie).
Stefan van den Akker
291
cat file2 >> file1
>>Operator dołącza wyjście do wskazanego pliku lub tworzy plik o nazwie, jeśli nie istnieje.
cat file1 file2 > file3
To łączy dwa lub więcej plików w jeden. Możesz mieć tyle plików źródłowych, ile potrzebujesz. Na przykład,
cat *.txt >> newfile.txt
Aktualizacja 20130902
W komentarzach eumiro sugeruje „nie próbuj cat file1 file2 > file1”. Przyczyną tego może nie być oczekiwany wynik, ponieważ plik odbierający przekierowanie jest przygotowywany przed wykonaniem polecenia po lewej stronie pliku >. W tym przypadku, po pierwsze file1jest obcięty do zerowej długości i otwarty do wyjścia, a następnie catpróby dowodzenia, aby złączyć się teraz plik o zerowej długości plusa zawartość file2do file1. W rezultacie file1utracono oryginalną zawartość, a na jej miejscu znajduje się kopia, file2której prawdopodobnie nie należy się spodziewać.
Aktualizacja 20160919
W komentarzach partner sugeruje połączenie z informacjami / źródłami wsparcia. W celu uzyskania wiarygodnego odniesienia kieruję czytelnika do strony sh man na linuxcommand.org, która stwierdza:
Przed wykonaniem polecenia jego dane wejściowe i wyjściowe mogą zostać przekierowane przy użyciu specjalnej notacji interpretowanej przez powłokę.
Chociaż to mówi czytelnikowi, co powinien wiedzieć, łatwo go przeoczyć, jeśli go nie szukasz i nie analizujesz słowa po słowie. Najważniejszym słowem jest tutaj „przed”. Przekierowanie jest zakończone (lub kończy się niepowodzeniem) przed wykonaniem polecenia.
W tym przypadku cat file1 file2 > file1powłoka najpierw wykonuje przekierowanie, aby uchwyty we / wy znajdowały się w środowisku, w którym polecenie zostanie wykonane przed jego wykonaniem.
Bardziej przyjazną wersję, w której szczegółowo omówiono pierwszeństwo przekierowania, można znaleźć na stronie Iana Allena w formie materiałów szkoleniowych dla systemu Linux. Jego strona Notatki o przekierowaniach we / wy ma wiele do powiedzenia na ten temat, w tym spostrzeżenie, że przekierowanie działa nawet bez polecenia. Przekazywanie tego do powłoki:
$ >out
... tworzy pusty plik o nazwie. Powłoka najpierw konfiguruje przekierowanie We / Wy, a następnie szuka polecenia, nie znajduje go i kończy operację.
@asir - nie próbuj cat file1 file2 > file1- to nie zadziała, jakbyś prawdopodobnie czekał.
eumiro
5
Właściwie tego właśnie potrzebuje. Mówi „bez nadpisywania bieżącego pliku1”. Pierwsze trzy Główni odpowiadający całkowicie zignorował tę część pytania i sugerowane polecenie za pomocą >>którego będzie zmodyfikować plik file1. T.Rob wykonał znacznie lepszą robotę, tłumacząc swoją odpowiedź, niż tylko ścigając się, aby przedstawić coś, co w rzeczywistości było nieprawidłowe. Na podstawie tekstu pytania uważam, że cat file1 file2 > file3jest to właściwe polecenie, którego szukał @asir.
dm78,
Dzięki za miłe słowa, David! To, na co @eumiro wskazuje powyżej, ale nie wchodzi w szczegóły, to to, że operacja po prawej stronie >jest wykonywana jako pierwsza. Więc wykonując cat file1 file2 > file1najpierw sprać file1następnie próbować skopiować plik teraz zero-length na siebie. Ma to sens, gdy myślisz o kolejności, w jakiej operacje mogą i powinny się odbywać, ale jest na tyle subtelne, że zaskakuje wielu ludzi. Więc jeśli nic więcej, eumiro i ty poprosiliście o dalszą poprawę odpowiedzi. Dziękuję za to!
T.Rob
Również nie spróbować cat plik1 >> plik1, to spowoduje, że plik, który ma być rekurencyjnie przepisany, ja przez pomyłkę i po prostu to zrobić w ciągu kilku sekund, 50 mln linii zostały wprowadzone do pliku, z tylko poprzednio kilkudziesięciu linii.
Hendra Uzia
Ponadto, aby uczynić go nieco bardziej zwięzłym, jeśli „nowy plik” już istnieje, >>dołącza się do pliku i >zastępuje plik.
rinogo
43
Uwaga : jeśli potrzebujesz użyć sudo , zrób to:
sudo bash -c 'cat file2 >> file1'
Zwykła metoda zwykłego przygotowania sudodo komendy zakończy się niepowodzeniem, ponieważ eskalacja uprawnień nie zostanie przeniesiona na przekierowanie wyjściowe.
Dla porównania, użycie ddrescue zapewnia przerywany sposób na wykonanie zadania, jeśli na przykład masz duże pliki i potrzebujesz zatrzymać, a następnie kontynuować w późniejszym momencie:
To logfilejest ważny kawałek. Możesz przerwać ten proces Ctrl-Ci wznowić go, ponownie określając dokładnie to samo polecenie, a ddrescue będzie czytać logfilei wznawiać od miejsca, w którym zostało przerwane. -o AFlaga mówi ddrescue zacząć od bajtów A w pliku wyjściowym ( file1). Więc wc --bytes file1 | awk '{ print $1 }'po prostu wyodrębnia rozmiar file1w bajtach (możesz po prostu wkleić dane wyjściowe, lsjeśli chcesz).
Jak zauważyli ngks w komentarzach, wadą jest to, że ddrescue prawdopodobnie nie zostanie domyślnie zainstalowany, więc będziesz musiał zainstalować go ręcznie. Inną komplikacją jest to, że istnieją dwie wersje ddrescue, które mogą znajdować się w twoich repozytoriach: zobacz to pytanie askubuntu, aby uzyskać więcej informacji. Wersja, którą chcesz, to GNU ddrescue, a na systemach opartych na Debianie jest to pakiet o nazwie gddrescue:
sudo apt install gddrescue
W przypadku innych dystrybucji sprawdź w systemie zarządzania pakietami wersję ddrescue GNU .
Z korzyścią dla nowych użytkowników: ddrescue jest narzędziem GNU, ale może nie istnieć w systemie Linux, Mac lub innym systemie uniksowym. Wydaje się, że ddrescue nie jest wymagany przez POSIX ani żaden inny standard.
2
Inne rozwiązanie:
cat file1 | tee -a file2
tee ma tę zaletę, że możesz dołączyć dowolną liczbę plików, na przykład:
cat file1 | tee -a file2 file3 file3
doda zawartość file1do file2, file3i file4.
Ze strony podręcznika:
-a, --append
append to the given FILEs, do not overwrite
Oszczędności czasu zgłaszane dla komendy find / cat polegają na tym, że mierzysz czas komendy find, która wypisuje nazwy plików. Spróbuj taktować całą komendę w ten sposób: time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)powinna ona dać wyniki podobne do komendy cat.
JoshMc
0
Możesz to również zrobić bez cat, choć szczerze mówiąc catjest bardziej czytelny:
>> file1 < file2
>>Dołącza STDIN się file1i <zrzuca file2do standardowego wejścia .
sudo
nacat
polecenie (i wprowadź poświadczenia, jeśli zostaniesz o to poproszony).tee
programie:cat 1 | tee -a 2 3
. Możesz umieścić tyle plików, ile chcesz po przełączeniu--append
(lub-a
w skrócie).cat file2 >> file1
>>
Operator dołącza wyjście do wskazanego pliku lub tworzy plik o nazwie, jeśli nie istnieje.cat file1 file2 > file3
To łączy dwa lub więcej plików w jeden. Możesz mieć tyle plików źródłowych, ile potrzebujesz. Na przykład,
cat *.txt >> newfile.txt
Aktualizacja 20130902
W komentarzach eumiro sugeruje „nie próbuj
cat file1 file2 > file1
”. Przyczyną tego może nie być oczekiwany wynik, ponieważ plik odbierający przekierowanie jest przygotowywany przed wykonaniem polecenia po lewej stronie pliku>
. W tym przypadku, po pierwszefile1
jest obcięty do zerowej długości i otwarty do wyjścia, a następniecat
próby dowodzenia, aby złączyć się teraz plik o zerowej długości plusa zawartośćfile2
dofile1
. W rezultaciefile1
utracono oryginalną zawartość, a na jej miejscu znajduje się kopia,file2
której prawdopodobnie nie należy się spodziewać.Aktualizacja 20160919
W komentarzach partner sugeruje połączenie z informacjami / źródłami wsparcia. W celu uzyskania wiarygodnego odniesienia kieruję czytelnika do strony sh man na linuxcommand.org, która stwierdza:
Chociaż to mówi czytelnikowi, co powinien wiedzieć, łatwo go przeoczyć, jeśli go nie szukasz i nie analizujesz słowa po słowie. Najważniejszym słowem jest tutaj „przed”. Przekierowanie jest zakończone (lub kończy się niepowodzeniem) przed wykonaniem polecenia.
W tym przypadku
cat file1 file2 > file1
powłoka najpierw wykonuje przekierowanie, aby uchwyty we / wy znajdowały się w środowisku, w którym polecenie zostanie wykonane przed jego wykonaniem.Bardziej przyjazną wersję, w której szczegółowo omówiono pierwszeństwo przekierowania, można znaleźć na stronie Iana Allena w formie materiałów szkoleniowych dla systemu Linux. Jego strona Notatki o przekierowaniach we / wy ma wiele do powiedzenia na ten temat, w tym spostrzeżenie, że przekierowanie działa nawet bez polecenia. Przekazywanie tego do powłoki:
... tworzy pusty plik o nazwie. Powłoka najpierw konfiguruje przekierowanie We / Wy, a następnie szuka polecenia, nie znajduje go i kończy operację.
źródło
cat file1 file2 > file1
- to nie zadziała, jakbyś prawdopodobnie czekał.>>
którego będzie zmodyfikować plikfile1
. T.Rob wykonał znacznie lepszą robotę, tłumacząc swoją odpowiedź, niż tylko ścigając się, aby przedstawić coś, co w rzeczywistości było nieprawidłowe. Na podstawie tekstu pytania uważam, żecat file1 file2 > file3
jest to właściwe polecenie, którego szukał @asir.>
jest wykonywana jako pierwsza. Więc wykonująccat file1 file2 > file1
najpierw spraćfile1
następnie próbować skopiować plik teraz zero-length na siebie. Ma to sens, gdy myślisz o kolejności, w jakiej operacje mogą i powinny się odbywać, ale jest na tyle subtelne, że zaskakuje wielu ludzi. Więc jeśli nic więcej, eumiro i ty poprosiliście o dalszą poprawę odpowiedzi. Dziękuję za to!>>
dołącza się do pliku i>
zastępuje plik.Uwaga : jeśli potrzebujesz użyć sudo , zrób to:
sudo bash -c 'cat file2 >> file1'
Zwykła metoda zwykłego przygotowania
sudo
do komendy zakończy się niepowodzeniem, ponieważ eskalacja uprawnień nie zostanie przeniesiona na przekierowanie wyjściowe.źródło
cat file2 | sudo tee -a file1 > /dev/null
Wypróbuj to polecenie:
źródło
Dla porównania, użycie ddrescue zapewnia przerywany sposób na wykonanie zadania, jeśli na przykład masz duże pliki i potrzebujesz zatrzymać, a następnie kontynuować w późniejszym momencie:
To
logfile
jest ważny kawałek. Możesz przerwać ten procesCtrl-C
i wznowić go, ponownie określając dokładnie to samo polecenie, a ddrescue będzie czytaćlogfile
i wznawiać od miejsca, w którym zostało przerwane.-o A
Flaga mówi ddrescue zacząć od bajtów A w pliku wyjściowym (file1
). Więcwc --bytes file1 | awk '{ print $1 }'
po prostu wyodrębnia rozmiarfile1
w bajtach (możesz po prostu wkleić dane wyjściowe,ls
jeśli chcesz).Jak zauważyli ngks w komentarzach, wadą jest to, że ddrescue prawdopodobnie nie zostanie domyślnie zainstalowany, więc będziesz musiał zainstalować go ręcznie. Inną komplikacją jest to, że istnieją dwie wersje ddrescue, które mogą znajdować się w twoich repozytoriach: zobacz to pytanie askubuntu, aby uzyskać więcej informacji. Wersja, którą chcesz, to GNU ddrescue, a na systemach opartych na Debianie jest to pakiet o nazwie
gddrescue
:W przypadku innych dystrybucji sprawdź w systemie zarządzania pakietami wersję ddrescue GNU .
źródło
Inne rozwiązanie:
tee
ma tę zaletę, że możesz dołączyć dowolną liczbę plików, na przykład:doda zawartość
file1
dofile2
,file3
ifile4
.Ze strony podręcznika:
źródło
cat
może być łatwym rozwiązaniem, ale staje się bardzo powolne, gdy łączymy duże pliki,find -print
ma cię uratować, chociaż raz musisz użyć cat.źródło
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
powinna ona dać wyniki podobne do komendy cat.Możesz to również zrobić bez
cat
, choć szczerze mówiąccat
jest bardziej czytelny:>> file1 < file2
>>
Dołącza STDIN sięfile1
i<
zrzucafile2
do standardowego wejścia .źródło