ディレクトリ内のすべてのファイル名を特定の形式に変更するには? [コピー]

ディレクトリ内のすべてのファイル名を特定の形式に変更するには? [コピー]

この形式の多くのファイルを含むディレクトリがあります。以下は私のファイルの2つの例です。

file_948_of_2000_push_data_12345.log
file_950_of_2000_push_data_12345.log

ご覧のとおり、唯一の違いはファイル番号948です950。今、この特定の形式ですべてのファイルの名前を変更したいと思います。

files_948.log
files_950.log

私ができる最良の方法は何ですか?

答え1

シェルパラメータ拡張の使用

$ for f in *.log; do g="${f/#file_/}"; echo mv -- "$f" "files_${g%%_*}.log"; done
mv -- file_948_of_2000_push_data_12345.log files_948.log
mv -- file_950_of_2000_push_data_12345.log files_950.log

Perlベースprenameまたはrenameコマンドを使用してください。

$ prename -n -- 's/^(.*?)_(.*?)_.*\.log$/$1s_$2.log/' *.log
file_948_of_2000_push_data_12345.log renamed as files_948.log
file_950_of_2000_push_data_12345.log renamed as files_950.log

使用mmv

$ mmv -n '*_*_*.log' '#1s_#2.log'
file_948_of_2000_push_data_12345.log -> files_948.log
file_950_of_2000_push_data_12345.log -> files_950.log

必要に応じて削除するか-necho

答え2

次のコマンドを試すことができます。

  ls -C1 file*log |  perl -ane 'chomp;$d=$_; s/^(\w+?)_(\d+?)_.*/$1s_$2.log/; print "mv -v $d $_\n";' | bash

Perlスクリプトは移動コマンドを生成します。 bashのパイプを閉じて、コマンドが好きなように機能することを確認してください。標準入力からファイルのリストを読み取り、最初の単語、下線、数字のセットを一致させ、次にmoveコマンドを印刷するPerlの単一行。 Linux以外のアプリケーションに必要な場合、Perlは単にファイル名を変更できます。指示。 1行のコードはデフォルトであり、パスを含むファイル名を処理しません。

関連情報