Řešení 1:
pro jeden soubor zkuste
mv dir1/dir2/dir3/file.{txt,txt.old}
kde X{a,b}
konstrukt expand na Xa Xb
, náhled můžete zobrazit pomocí
echo dir1/dir2/dir3/file.{txt,txt.old}
abyste zjistili, zda to vyhovuje vašim potřebám.
poznámka:
-
to pro více souborů
mv dir1/dir2/dir3/file{1,2,3}.{txt,txt.old}
je nepravděpodobné, že se rozšíří na to, co chcete. (to se rozšíří na směs soubor.txt soubor1.txt.starý soubor2.txt ...)
-
{txt,txt.old}
lze zkrátit na{,.old}
podle komentáře -
pokud je název adresáře jednoznačný, lze použít zástupný znak.
mv *1/*2/d*/*.{,old}
pro více souborů použijte rename
rename -n s/txt/old.txt/ dir1/dir2/dir3/file*.txt
drop -n
mít účinné přejmenování.
Řešení 2:
Příkaz rename
přejmenuje všechny odpovídající soubory. Jeho hlavním účelem je přejmenovat více souborů, ale pokud výraz v Perlu odpovídá pouze jednomu souboru, přejmenuje pouze tento jediný soubor. Pro podrobnosti a specifickou syntaxi distribuce si prosím přečtěte manuálovou stránku:man rename
.
Příklad použití:přejmenujte „/cesta/soubor.txt“ na „/cesta/soubor.txt.old“:
rename 's/file.txt/file.txt.old/g' /path/file.txt
Kratší zápis (díky shalombu):
rename 's/$/.old/' /path/file.txt
rename '$_.=".old"' /path/file.txt
Pro běh nasucho použijte rename -n
.
Další příklady a podrobnosti lze nalézt na https://thepcspy.com/read/bulk-rename-files-in-ubuntu/
Řešení 3:
Líbí se mi řešení @archemar s použitím rozšíření {}, protože jej můžete použít, když jste již spustili příkazový řádek. Zde jsou některé další možnosti pro úplnost:
F="dir1/dir2/dir3/file.txt" ; mv "$F" "$F.old"
(uvozovky jsou nutné pouze v případě, že máte v názvu mezery nebo jiné znaky pro dělení slov)
mymv() {
mv "$1/$2" "$1/$3"
}
mymv dir1/dir2/dir3 file.txt file.txt.old
mymv dir5/dir6/dir7 file.txt file.txt.old
Poznámky:
- Toto je syntaxe bash, možná používáte jiný shell
mymv
může být jakýkoli rozumný řetězec, použil jsem mymv pro "můj pohyb".- Definici funkce lze vložit do vašeho .bash_profile
Další:
cd dir1/dir2/dir3 ; mv file.txt file.txt.old ; cd -
ale
(cd dir1/dir2/dir3/ && exec mv file.txt file.txt.old)
(od @Adam a @CharlesDuffy) je pravděpodobně lepší v případě, že cd selže.
Řešení 4:
V jednorázovém případě, pokud nechci změnit svůj aktuální adresář, mohu použít pouze sub-shell:
(cd dir1/dir2/dir3/ && mv file.txt file.txt.old)
Protože vy cd
uvnitř sub-shell jste nezměnili svůj adresář ve vašem skutečném shellu
Řešení 5:
Pokud chcete vstoupit do podadresáře za účelem zkrácení mv
příkaz, ale chcete se poté vrátit do aktuálního adresáře, existují dva způsoby, jak to udělat. Jedním z nich je zadat cd
a mv
v subshell (jak již bylo navrženo).
Druhým je použití pushd
a popd
pro změnu adresářů:
pushd dir1/dir2/dir3/; mv file.txt file.txt.old; popd
pushd
příkaz je jako cd
, kromě toho, že nejprve vloží název aktuálního adresáře do zásobníku. popd
odebere nejvyšší název ze zásobníku a změní se na tento adresář.