GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu použít zástupné znaky stylu ms-dos s ls a mv?

Jeden ze základních rozdílů mezi Windows cmd a shelly POSIX jsou zodpovědné za rozšíření zástupných znaků. Shelly provedou všechna potřebná rozšíření před spuštěním skutečných příkazů, které jste požadovali. cmd většinou předává vzory zástupných znaků příkazům beze změny. (Říkám většinou, protože si myslím, že existují výjimky a proměnné prostředí se za většiny okolností rozšiřují.) To umožňuje psaní rename to by fungovalo se stejnou syntaxí jako v cmd docela složité.

Ale existuje rename pro Linux - s úplně jinými argumenty se podívejte na manuálovou stránku (která je na mém systému trochu stručná a rename pochází z util-linux balíček v mém systému, který by měl být široce dostupný). Vaše první přejmenování by bylo provedeno takto:

rename .txt .bak *.txt

Všimněte si, že shell dělá * rozšíření, takže rename sám si ve skutečnosti myslí, že byl vyvolán takto:

rename .txt .bak file1.txt file2.txt file3.txt ...

Takže můžete hádat verzi jednoho souboru:

rename .txt .bak file1.txt

Pokud nechcete používat rename ale implementujte to sami, můžete pro to vytvořit funkci. Za předpokladu, že chcete změnit pouze příponu souboru a pro přejmenování jednoho souboru, podívejte se na toto:

$ function chext() {
  newext="$1"
  file="$2"
  newfile="${file%.*}$newext"
  echo mv "$file" "$newfile"
}
$ chext .csv test.txt
mv text.txt text.csv

$newfile je vytvořen pomocí odstranění podřetězce, aby se odstranilo původní rozšíření, a poté zřetězí nové rozšíření. Tuto funkci můžete rozšířit tak, aby zpracovávala více souborů relativně snadno.

Pokud jde o vaše ls otázku, použijte -d přepínač. Tím zabráníte ls z výpisu obsahu adresářů.

Demo:

$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:29 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.csv
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Přejmenování zástupného znaku

$ rename .csv .txt f*
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Přejmenování jednoho souboru

$ rename .txt .csv f1.txt 
$ ls -al
total 536
drwx------   3 owner users 528384 Jan  7 17:34 .
drwxr-xr-x 126 owner users  12288 Jan  7 17:26 ..
-rw-r--r--   1 owner users      0 Jan  7 17:28 f1.csv
-rw-r--r--   1 owner users      0 Jan  7 17:28 f2.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f3.txt
-rw-r--r--   1 owner users      0 Jan  7 17:28 f4.txt
drwxr-xr-x   2 owner users   4096 Jan  7 17:33 test
-rw-r--r--   1 owner users      0 Jan  7 17:27 test.csv

Výchozí ls

$ ls -l t*
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

test:
total 0
-rw-r--r-- 1 owner users 0 Jan  7 17:33 dont_show_me_please

ls který nekontroluje adresáře

$ ls -ld t*
drwxr-xr-x 2 owner users 4096 Jan  7 17:33 test
-rw-r--r-- 1 owner users    0 Jan  7 17:27 test.csv

Jedna věc, kterou je třeba mít na paměti, pokud jde o zástupné znaky, je to, že jsou rozšířeny shellem. Aplikace neví, zda jste použili zástupné znaky nebo zadali názvy. Pokud například zadáte rename *.txt *.bak a poté rename příkaz vidí něco jako rename file1.txt file2.txt existingfile.bak . Na pokračování to nestačí.

Budu se zabývat otázkou o ls za prvé, protože je to jednodušší. Pokud chcete pouze odpovídající názvy, nepotřebujete ls , protože shell již provádí expanzi.

echo t*

Pokud chcete více informací o souborech, předejte -d možnost na ls , abyste mu řekli, že nemá vypisovat obsah adresářů.

ls -ld t*

Neexistuje žádný standardní nástroj pro přejmenování souborů, protože první unixové systémy s ním nepřišly. Přenosná metoda pro přejmenování souborů používá smyčku a je trochu podrobná:

for x in *.txt; do mv -- "$x" "${x%.txt}.bak"; done

Existuje několik běžných utilit pro přejmenování souborů, z nichž žádný není zaručeně nainstalován na daný unixový systém, ale všechny se snadno instalují. Zde jsou ty hlavní:

  • rename z util-linux sadu, která je k dispozici na každém neembedded systému Linux (a nikde jinde). V Debianu a jeho derivátech (včetně Ubuntu) se tento příkaz nazývá rename.ul . Za předpokladu, že se nevyskytuje .txt jiné než konečné rozšíření, můžete napsat

    rename .txt .bak *.txt
    
  • rename je skript v Perlu, který Debian a jeho deriváty dodávají jako /usr/bin/rename . Soubory můžete přejmenovat podle libovolných příkazů Perlu.

    rename 's/\.txt\z/\.bak/' *.txt
    
  • mmv , který dokáže přejmenovat, kopírovat a propojit soubory podle několika vzorů založených na názvech a má mnoho možností týkajících se toho, co se stane, pokud cílové jméno již existuje. Všimněte si, že musíte použít uvozovky k ochraně zástupných znaků před rozšířením pomocí shellu.

    mmv '*.txt' '#1.txt'
    
  • zmv je funkce zsh, která je k dispozici tehdy a pouze tehdy, když je váš shell zsh. Může odpovídat libovolným vzorům zsh (takže můžete porovnat názvy souborů podle libovolných regulárních výrazů, nejen podle zástupných znaků, a můžete porovnat soubory podle dalších kritérií, jako jsou data a velikosti). zmv může také kopírovat a odkazovat.

    zmv '(*).txt' '$1.txt'
    

Pokud máte nějakou kontrolu nad stroji, které používáte, doporučuji použít jako shell zsh (má jiné výhody než bash) a vložit tyto řádky do ~/.zshrc :

autoload -U zmv
alias zmv='noglob zmv -w'
alias zcp='zmv -C'
alias zln='zmv -L'
alias zsy='zmv -Ls'

noglob je funkce zsh, která říká shellu, aby nerozšiřoval zástupné znaky v argumentu příkazu. Tímto způsobem můžete napsat zmv *.txt \$1.txt (vždy budete muset chránit $ v náhradním textu).


Linux
  1. Jak pracovat s uživateli a skupinami v Linuxu

  2. Jak používat přesměrování výstupu v kombinaci s dokumenty Here a Cat?

  3. Jak používat Linux Shutdown and Reboot Command s příklady

  1. Jak mohu používat aliasované příkazy s xargs?

  2. Jak mohu použít výstražný dialog s Pythonem v linuxu?

  3. Jak používat zástupné znaky v příkazu xargs?

  1. Jak používat příkazy „cat“ a „tac“ s příklady v Linuxu

  2. Jak používat Pipes a Named Pipes v Linuxu (s příklady)

  3. Jak nakonfigurovat SSH pro omezení uživatelů/skupin pomocí direktiv povolení a zakázání