私のLinuxコンピュータのフォルダには、次のような名前のファイルがたくさんあります。
11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35
正規表現を使用して.inp拡張子に名前を変更したいと思います。
頑張った
mv * *.inp
mv: target '*.inp' is not a directory
エラーが発生します。また、*の代わりに正規表現[123][12345]を使ってみました。
だから私はmvがファイルを移動するために使用されることを理解しています。また、./*.inp
mvを同じフォルダに書き込むように強制することもできると思いましたが、失敗しました。それでは、どのように機能するのかを正しく理解していないmv
だけでなく、どうすればこれを行うことができますかmv
?
ベストアンサー1
コマンドの問題は、mv
単一のファイル(正確に2つのコマンドライン引数が指定されている場合)のみを移動したり、名前を変更したり、複数のファイルを単一のターゲットディレクトリ(複数のコマンドライン引数)に移動できることです。
あなたの場合、拡張子を* *.inp
引数として使用しており、これは現在のディレクトリに表示されているすべてのファイル名に拡張され、その後に一致する名前が続きます*.inp
。これが3つ以上の名前に拡張されていると仮定すると、コマンドが有効なコマンドになるには、最後のパラメータがディレクトリ名でなければなりません。mv
それ以外の場合は、「ディレクトリではありません」エラーが発生します。
この場合、私たちはmv
一度に2つの引数を使用し、そのためにシェルループを使用する必要があります。
for name in [123][1-5]; do
mv "$name" "$name.inp"
done
これは、前述のファイル名のワイルドカードパターン(バリエーション)と一致するすべての名前を繰り返します(注、これは正規表現ではありません)。ループ本体では、現在の名前は変数に保存され、name
名前mv
の末尾に追加してファイル名を簡単に変更できます。.inp
mv
名前の競合の可能性がある場合は、既存のファイルを上書きすることを防ぐことはできません。これにGNUを使用すると仮定すると、その(または)オプションと一緒に使用する必要があります(または)オプションと一緒に使用する必要がありますmv
。mv
--no-clobber
-n
--backup
-b
あるいは、ターゲット名が存在するかどうかを明示的に確認し、存在する場合は現在のファイルをスキップできます。また、ターゲット名と同じ名前のディレクトリがある場合、ファイルが既存のディレクトリに移動するのを防ぎます。
for name in [123][1-5]; do
[ -e "$name.inp" ] || [ -L "$name.inp" ] && continue
mv "$name" "$name.inp"
done
GNUを(または)mv
と一緒に使用したり、既存のファイルを上書き(またはバックアップ)したり、ターゲット名と同じ名前のサブディレクトリにファイルを移動したりすることを防ぎます。--no-target-directory
-T
-n
-b
-b