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
zutil-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 napsatrename .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).