この形式の多くのファイルを含むディレクトリがあります。以下は私のファイルの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
必要に応じて削除するか-n
。echo
答え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行のコードはデフォルトであり、パスを含むファイル名を処理しません。