Linux:特定の文字の最初のインスタンスのみをターゲットにしながら、ループ内のファイル名を変更します。

Linux:特定の文字の最初のインスタンスのみをターゲットにしながら、ループ内のファイル名を変更します。

このスレッド(https://superuser.com/questions/659876/how-to-rename-files-and-replace-characters)は豊富であることが証明されており、ファイル名の文字の最初のインスタンスを置き換える必要があることを除いて、必要なことを行います。

どうすればいいですか?

for f in *:*; do mv -v "$f" $(echo "$f" | tr '.' '_'); done

.次のように、filenameの最初のインスタンスのみを置き換えます。

2022-10-07T071101.8495077Z_QueryHistory.txt

答え1

残念ながら、試している方法は必要以上に複雑で脆弱です(ファイル名に特定の特殊文字が含まれていると競合が発生します)。これは以下に基づくより簡単なアプローチです。パラメータ拡張変換ファイル名:

for f in *; do mv -v -- "$f" "${f/./_}"; done   # replace the first .
for f in *; do mv -v -- "$f" "${f//./_}"; done  # replace every .

これにはシェルとしてbash、ksh、またはzshが必要です。 dash(Ubuntuのスクリプトには頻繁に使用されますが、インタラクティブにはほとんど使用されません)などの他のシェルにはパラメータ拡張形式は/bin/shありません。${VARIABLE/PATTERN/REPLACEMENT}

prenameまたは()を使用できますapt install rename

rename 's/\./_/' *     # replace the first .
rename 's/\./_/g' *    # replace every .

または、次のものを使用できます。扱いにくい~のズマブ:

autoload -U zmv   # put this in your .zshrc
zmv '*' '${f/./_}'        # replace the first .
zmv -W '*.*.*' '*_*.*'    # replace the next-to-last .
zmv '*' '${f//./_}'       # replace every .

私の答えのすべての部分は、名前がドットで始まるファイルをスキップします。

答え2

使用Perlrenameコマンドライン:

    rename -n 's/\./_/' ./2022-10-07T071101.8495077Z_QueryHistory.txt

出力がうまくいったら削除してください-n(別名)。dry-run

関連情報