GNU/Linux >> Znalost Linux >  >> Linux

Dd vs Cat – je Dd v dnešní době stále relevantní?

Nedávno jsem si uvědomil, že můžeme použít cat stejně jako dd a ve skutečnosti je rychlejší než dd

Vím, že dd byl užitečný při práci s páskami, kde na velikosti bloku skutečně záleželo správnost, nejen výkon. V dnešní době však existují situace, kdy dd může něco udělat cat nemůže? (Zde bych považoval méně než 20% rozdíl ve výkonu za irelevantní.)

Konkrétní příklady by byly hezké!

Přijatá odpověď:

Ve vzhledu dd je nástroj z operačního systému IBM, který si zachoval svůj cizí vzhled (předávání parametrů), který provádí některé velmi zřídka používané funkce (např. konverze EBCDIC na ASCII nebo obrácení endianness… není v dnešní době běžná potřeba).

Dříve jsem si myslel, že dd byl rychlejší pro kopírování velkých bloků dat na stejný disk (kvůli efektivnějšímu využití vyrovnávací paměti), ale to není pravda, alespoň na dnešních systémech Linux.

Myslím, že některé z dd Možnosti jsou užitečné při práci s páskami, kde se čtení skutečně provádí v blocích (ovladače pásek neskryjí bloky na paměťovém médiu tak, jak to dělají ovladače disků). Ale neznám podrobnosti.

Jedna věc dd lze to udělat nelze (snadno) provést žádným jiným nástrojem POSIX zabírá prvních N bajtů proudu. Mnoho systémů to umí pomocí head -c 42 , ale head -c , ačkoli je běžný, není v POSIX (a dnes není dostupný např. na OpenBSD). (tail -c je POSIX.) Také, i když head -c existuje, může číst příliš mnoho bajtů ze zdroje (protože interně používá ukládání do vyrovnávací paměti stdio), což je problém, pokud čtete ze speciálního souboru, kde má vliv pouhé čtení. (Aktuální GNU coreutils čtou přesný počet pomocí head -c , ale FreeBSD a NetBSD používají stdio.)

Obecněji dd poskytuje rozhraní pro základní souborové API, které je jedinečné mezi unixovými nástroji:pouze dd může přepsat nebo zkrátit soubor v libovolném bodě nebo hledat v souboru. (Toto je dd ‚jedinečná schopnost, a je to velká; kupodivu dd je nejlépe známý pro věci, které mohou dělat jiné nástroje.)

  • Většina unixových nástrojů přepíše svůj výstupní soubor, tj. vymaže jeho obsah a spustí jej od začátku. To se stane, když použijete > přesměrování také v shellu.
  • K obsahu souboru můžete připojit pomocí >> přesměrování v shellu nebo pomocí tee -a .
  • Pokud chcete zkrátit soubor odstraněním všech dat po určitém okamžiku , toto je podporováno základním jádrem a C API prostřednictvím truncate funkce, ale není vystavena žádným nástrojem příkazového řádku kromě dd :

    dd if=/dev/null of=/file/to/truncate seek=1 bs=123456  # truncate file to 123456 bytes
    
  • Pokud chcete přepsat data uprostřed souboru, opět je to možné v podkladovém API otevřením souboru pro zápis bez zkrácení (a voláním lseek v případě potřeby přesunout na požadovanou pozici), ale pouze dd může otevřít soubor bez zkrácení nebo připojení, nebo hledat z shellu (složitější příklad).

    # zero out the second kB block in the file (i.e. bytes 1024 to 2047)
    dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
    

Takže... Jako systémový nástroj dd je celkem k ničemu. Jako nástroj pro zpracování textu (nebo binárního souboru) je to docela cenné!

Související:Vypočítat počet dní do zaplacení?
Linux
  1. 10 příkladů příkazů Cat pro správu souborů v systému Linux / UNIX

  2. Jak kat <<EOF >> soubor obsahující kód?

  3. najít a odstranit soubor nebo složku starší než x dní

  1. Proč po všech těch letech stále miluji tcsh

  2. Výhody katovacího pilníku a potrubí do grep

  3. Bezvadné mazání souborů starších než 30 dní

  1. Je filozofie Linuxu v roce 2019 stále aktuální?

  2. Důležité příklady příkazů Cat v Linuxu

  3. Kočičí čára X do čáry Y na obrovském souboru?