jpg拡張子を持つすべてのファイルの名前が変更されます。
rename 'y/a-z/A-Z/' *.jpg
これによりファイル名が変更され、拡張子の名前も変更されます。
rename 'y/a-z/A-Z/' image.jpg
拡張子を変更せずに単一ファイルの名前を変更するには?
example.jpg
出力は次のようになります。
EXAMPLE.jpg
答え1
そして名前を変更する
rename -n 's/.*\./\U$&/'
-n
議論は、変化を起こさずに何が起こるのかを教えることです。.*
正規表現の世界のパラメータはオプションです。すべて\.
、選択ポイントの前のすべて[.]⇾.*\.
選択ポイントの前のすべてと一緒に使用されます。- [ドット]が含まれているため、
\
文字をエスケープするには[バックスラッシュ]を使用してください。.
正規表現。
- [ドット]が含まれているため、
\U
引数は大文字化を意味します。エスケープシーケンスPerl正規表現では、\
[バックスラッシュ]と一緒に使用する必要があります。$&
最後に成功したパターン検索で一致する文字列を見つけるために使用されるパラメータ。戻りの例/find/$&ADD/
: findADD
返品:
rename(fellowSHIP.jpg, FELLOWSHIP.jpg)
rename(retorno2.jpg, RETORNO2.jpg)
rename(retorno3.jpg, RETORNO3.jpg)
rename(retorno4.jpg, RETORNO4.jpg)
rename(shein1.jpg, SHEIN1.jpg)
rename(shein2.jpg, SHEIN2.jpg)
rename(shein3.jpg, SHEIN3.jpg)
rename(shein4.jpg, SHEIN4.jpg)
rename(shein-girl1.jpg, SHEIN-GIRL1.jpg)
rename(sheingirl2.jpg, SHEINGIRL2.jpg)
rename(twoTowers1.jpg, TWOTOWERS1.jpg)
rename(twoTowers2.jpg, TWOTOWERS2.jpg)
rename(twoTowers3.jpg, TWOTOWERS3.jpg)
rename(twoTowers4.jpg, TWOTOWERS4.jpg)
rename(twoTowers5.jpg, TWOTOWERS5.jpg)
rename(twoTowers6.jpg, TWOTOWERS6.jpg)
答え2
rename 's/(.*)(\.[^.]+)/\U$1\E$2/' example.jpg
s/
交換開始(.*)
最初のグループにキャプチャされたサフィックス(すべての文字、数字)の前のファイル名の部分と一致します。(\.[^.]+)
2番目のグループにキャプチャされたサフィックスaの.
後に1つ以上の非文字が続くものと一致します。.
/
交換開始\U
大文字(〜まで\E
)$1
最初に一致するグループの挿入\E
最終状況の修正$2
2 番目の一致グループの挿入/
端末交換
答え3
(の関連性がなく、非常に制限されていることに加えて)現在、perlコマンドのutil-linux
いくつかのバリエーションがあります(もともとはrename
perl
3.0に含まれる非常に短いサンプルスクリプト)。
とともにhttps://metacpan.org/dist/File-Renameまた、Debianベースのシステムの最新パッケージでは、rename
すべてのファイル名のすべてのASCII文字を大文字に変換しますが、拡張子(存在する場合)を変換したくない場合は、次のようにします。
rename -d -- 's/.*\.|.*/\U$&/s' "$file"
どこ:
-d
ファイルのディレクトリ名が影響を受けないことを確認してください。--
この実装では、$file
開始を-
オプションとして取る必要があります(--e=exec("rm -rf ~")
たとえば、呼び出されたファイルに対して悲惨な結果が発生します)。- 代替フラグが必要です
s
。それ以外の場合は、改行(ファイル名のすべての文字と同じ有効な文字)が一致しません。s
.
.*\.|.*
一番右のアイテム.
(.*
欲求など)またはすべてのアイテムと一致します。perl
左のパターンが最初に試行され、POSIX正規表現とは異なり、他のパターンがより長い一致を生成することを確認しようとする試みは行われないことに注意してください。したがって、拡張子があるファイルの場合は拡張子の前の内容と一致し、拡張子のないファイルの場合は完全なファイル名と一致します。$&
一致する内容です。プレフィックスとして使用すると、/から借りた\U
ように大文字に変換されます。ex
vi
perl
はい-n
(テスト実行用):
$ rename -n -d -- 's/.*\.|.*/\U$&/s' $'--e=system("echo reboot") #/foo\nbar.jpg'
rename(--e=system("echo reboot") #/foo
bar.jpg, --e=system("echo reboot") #/FOO
BAR.jpg)
$ rename -n -d -- 's/.*\.|.*/\U$&/s' .config/gtkrc
rename(.config/gtkrc, .config/GTKRC)
$ rename -n -d -- 's/.*\.|.*/\U$&/s' .bashrc
$
(.bashrc
ここではbashrc
拡張と見なされます)。
1つの問題は、ASCIIファイル名でのみ機能することです。
たとえば、UTF-8Stéphane.jpg
をSTéPHANE.jpg
。STÉPHANE.jpg
é
Stéphane.jpg
St<U+F310>phane.jpg
この問題を解決するrename
のは少し痛みです。次のようなものが必要です。
rename -n -d -- '
use Encode::Locale;
use Encode;
$_ = decode(locale_fs => $_);
s/.*\.|.*/\U$&/s;
$_ = encode(locale_fs => $_)' "$file"
ロケールの文字セットを使用して、エンコードされたかのようにファイルを処理します。
ただし、文字でデコードできないバイトを一部の代替文字に変換します(ロケールに似ている?
か、�
ロケールによって異なります。Cロケールには127以上のすべてのバイト値が含まれています)。
最後に、シェルの演算子を使用する方が簡単で安全です。図zsh
:
case $file:t in
(*.*) newfile=$file:h/$file:t:r:u.$file:e;;
(*) newfile=$file:h/$file:t:u;;
esac
[[ $file = $newfile ]] || mv -i -- $file $newfile
(その中にはcsh:t
スタイルの修飾子があり、それぞれail、ead、ootname、xtension、およびTurnをppercaseとして生成します。):h
:r
:e
:u
t
h
r
e
u
zsh
演算子は最善の努力をします。つまり、デコードできないバイトシーケンスを残してデコードできる文字を変換します。
zsh
zmv
自動ロード機能で実装された独自の組み込みバッチの名前変更ツールもあります。
autoload -Uz zmv # best in ~/.zshrc
zmv '(*).(*)' '$1:u.$2'
(隠されていないファイルの名前を拡張子にのみ変更します)
zmv
名前の変更を始める前に、いくつかの完全性チェックも行われていますrename
。