シェル:zsh
こんにちは、私はDOSのようにファイルのファイル拡張子をすばやく変更したいと思います。
私はまだ質問に答えていないこの質問(一種)を見つけました。 拡張子を変更するには、mvを使用して複数のファイルの名前を変更します。
私は特定のディレクトリにあるファイルの拡張子を変更したいと思います。pwd
したがって、これを行うときにmv
同じディレクトリに戻りたくありません。つまり:
mv /Users/dir/dir1/moredir/long/foo.txt /Users/dir/dir1/moredir/long/foo.yaml
私のようなN00bsは単に/Users/dir/dir1/moredir/long/foo.txt *.yamlに移動できると仮定していますが、そうではありません。
これを達成する簡単な方法はありますか?
よろしくお願いし、楽しい週末をお過ごしください!
答え1
単一ファイルの場合は、次のものを使用できます。支柱の拡張ファイル名の一部のみが変更されるファイルの名前を変更するコマンドラインを設定します。
mv /Users/dir/dir1/moredir/long/foo.{txt,yaml}
一般的な構文は実行前に拡張されます。mv UNCHANGED1{OLD,NEW}UNCHANGED2
mv UNCHANGED1OLDUNCHANGED2 UNCHANGED1NEWUNCHANGED2
mv
複数のファイルの場合、zsh機能zmv
ファイルを移動して名前を変更する便利な方法を提供します。これをあなたのものに入れるか、.zshrc
使用したいすべてのセッションのコマンドラインから実行してくださいzmv
。
autoload -zU zmv
次に、現在のディレクトリのファイル拡張子を変更するには、次のいずれかを実行できます。引数は呼び出し前ではなく内部的に解釈される必要がある*
ため、単一引用符で囲む必要があります。$
zmv
zmv
zmv '*.txt' '$f:r.yaml'
zmv '(*).txt' '$1.yaml'
zmv -w '*.txt' '$1.yaml'
zmv -W '*.txt' '*.yaml'
ディレクトリパスを繰り返さずに別のディレクトリのファイル拡張子を変更するには、次の手順を実行します。
zmv '/Users/dir/dir1/moredir/long/*.txt' '$f:r.yaml'
(cd /Users/dir/dir1/moredir/long && zmv '(*).txt' '$1.yaml')
(cd /Users/dir/dir1/moredir/long && zmv -w '*.txt' '$1.yaml')
(cd /Users/dir/dir1/moredir/long && zmv -W '*.txt' '*.yaml')
代替テキストでは:
$f
完全なソースパスです。:r
は履歴修飾子これにより、ファイル名から拡張子が削除されます。$1
ソースパターン内の括弧内の最初のグループ。括弧内のグループにはディレクトリ区切り文字を含めることはできません(例外はここには適用されません)。- この
-w
フラグは自動的に各ワイルドカード文字をグループに配置します。 - この
-W
フラグを使用すると、代替テキスト*
の各要素が*
ソースパターンの対応する一致を表します。
(これを行うためのいくつかのツールがいくつかありますが、macOSを含むほとんどのUnixバリアントはデフォルトのインストールの一部ではありません。zshを使用しているので、優れたタスクを実行するzmvを活用してください。)
答え2
単一ファイルの名前をディレクトリfoo.txt
に変更するには、まずディレクトリに変更してから次のように実行します。foo.yaml
/Users/dir/dir1/moredir/long
mv
cd /Users/dir/dir1/moredir/long
mv foo.txt foo.yaml
cd - # to move back to the original working directory
または、中かっこ拡張を使用してソースとターゲットのパス名を拡張できます。
mv /Users/dir/dir1/moredir/long/foo.{txt,yaml}
上記は完全なコマンドで拡張されます。
mv /Users/dir/dir1/moredir/long/foo.txt /Users/dir/dir1/moredir/long/foo.yaml
...シェル呼び出し前mv
。明らかに、これは名前を変更してもファイルが同じディレクトリに残る必要がある場合にのみ機能します。