Odpowiedzi:
Przyszło mi do głowy jeszcze jedno zagadnienie, w którym cat
vs. cp
robi znaczącą różnicę:
Z definicji cat rozszerzy rzadkie pliki, wypełniając luki „prawdziwymi” bajtami zerowymi, podczas gdy co najmniej cp można nakazać zachowanie dziur.
Pliki rzadkie to pliki, w których sekwencje zerowe bajtów zostały zastąpione metadanymi w celu zaoszczędzenia miejsca. Możesz przetestować, tworząc go za pomocą dd i powielić go za pomocą wybranych narzędzi.
Utwórz rzadki plik (wcześniej zmieniając na / tmp, aby uniknąć problemów - patrz uwaga końcowa):
15> cd /tmp
16> dd if=/dev/null of=sparsetest bs=512b seek=5
0+0 records in
0+0 records out
0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
zmień to - nie powinno zająć miejsca.
17> du -sh sparsetest
0 sparsetest
skopiuj z cp i sprawdź rozmiar
18> cp sparsetest sparsecp
19> du -sh sparsecp
0 sparsecp
teraz skopiuj go za pomocą kota i sprawdź rozmiar
20> cat sparsetest > sparsecat
21> du -sh sparsecat
1.3M sparsecat
wypróbuj preferowane narzędzia, aby sprawdzić ich zachowanie
nie zapomnij posprzątać.
Ostatnia uwaga: takie eksperymenty mają nieodłączną szansę na zdobycie sławy u lokalnego administratora systemu, jeśli wykonujesz je na systemie plików, który jest częścią jego planu tworzenia kopii zapasowych lub jest krytyczny dla dobrego funkcjonowania systemu. W zależności od wyboru narzędzia do tworzenia kopii zapasowych może on potrzebować więcej nośników taśmowych, niż kiedykolwiek uważał za możliwe wykonanie kopii zapasowej tego jednego pliku 0-bajtowego, który zostanie rozszerzony do terabajtów zer.
Inne pliki, których nie można skopiować ani za pomocą cat, ani cp, zawierałyby specjalne pliki na urządzeniu itp. Zależy to od implementacji narzędzia do kopiowania, czy jest on w stanie powielić węzeł urządzenia, czy też wesoło skopiowałby jego zawartość.
cp
ma opcję kontrolowania swojego zachowania na rzadkich plikach; jak, z --sparse=never
określonym w linii poleceń, cp
jest tak wolny jak cat
.
Zgodnie z komentarzem Keitha , cp
zachowuje pewne uprawnienia i cat
tworzy nowy plik jak umask
wskazuje. Tak więc $2
pozwolenie nie jest zachowane, $4/vmlinuz
jest całkiem czyste, a jeśli jakieś dziwne pozwolenie zostanie włączone $3
, $4/System.map
zachowa to.
cat
trwałość?
cat
szybszy?
Oba mają równoważne funkcje w tych dwóch przypadkach, ale cp jest czysto operacją na pliku. „Weź ten plik i zrób jego kopię”.
cat, z drugiej strony, ma na celu zrzucenie zawartości pliku na konsolę. „Weź ten plik i wyświetl go na ekranie”, a następnie niech ninja zaatakuje ekran i przekieruje wyjście w inne miejsce.
cp byłby ogólnie bardziej wydajny, ponieważ nie ma tylko przekierowania, jedynie bezpośrednie kopiowanie bajtów z lokalizacji A do lokalizacji B.
kot byłby read bytes -> output to console -> intercept output -> redirect to new file
.
cat
tak naprawdę nie output to console -> intercept output -> redirect to new file
, plik wyjściowy dla cat może być standardowym lub zwykłym plikiem, po prostu wyśle do pliku, o ile dane wejściowe nie są takie same jak dane wyjściowe.
cat
nie ma nic wspólnego z konsolą. Zarówno cat
i cp
odczytać z pliku wejściowego i zapisać do pliku wyjściowego. Z cat
, plik wyjściowy jest otwierany przez powłokę, podczas gdy z cp
, plik wyjściowy jest otwierany przez cp
; nie ma to różnicy w wydajności. cp
może być szybszy, ale z zupełnie innego powodu: niektóre implementacje cp
próbują odgadnąć właściwy rozmiar porcji dla wydajności w zależności od urządzenia źródłowego i docelowego; wdrożenie cat
nie przeszkadzałoby.
To naprawdę kwestia preferencji, IMHO.
Technicznie nie ma prawdziwej różnicy, chyba że użyjesz polecenia cp z przełącznikiem -p, aby zachować własność / grupę plików. W przeciwnym razie funkcjonalnie jest to samo. Odpowiedź Marca jest jednak o wiele bardziej szczegółowa i dokładna.
cp
bez -p
zachowuje niektóre uprawnienia. Na przykład, jeśli plik źródłowy jest wykonywalny, cp
spowoduje, że plik docelowy będzie wykonywalny, ale cat
nie.
cp
czyni plik tak jak w oryginale, natomiastcat
tworzy nowy plik o tej samej treści.