名前変更コマンドを使用したファイル名の変更

名前変更コマンドを使用したファイル名の変更

次のコマンドにどのような問題があるか教えてください。

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

注 - 私はループ構文ではなくコマンドを使用してこれを行うことを好みます。

私が望むのは、名前を追加して/tmp/dirの下のすべてのファイル名を変更することです安定_各ファイルの前に

たとえば(ファイル)

Fevc.txt
Ddve.txt

次に、名前を変更する必要があります。

fixed_Fevc.txt
fixed_Ddve.txt

答え1

一時的な注意:問題があります。名前変更モードはパスを含むファイル名を処理しません。修正作業中です。

コマンドには2つのエラーがあります。

find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'

  • スペースを含むファイル名のみを一致させます-name "* *"。これは欲しいものではありません。そうですか?

    • 解決策はこれを除外することです。特定の名前に一致するファイルを除外したくありません。すべてのファイルが欲しい。
  • このrenameモデルは2つの点で間違っています。

    • Shell globパターンを使用しましたが、正規表現、つまり正規表現である必要があります(一部の一般的なPerl式である可能性があります。無視して使用しますs///g)。
    • 固定パターンはフルネームに合わせて置き換えられますfixed_。技術的には「最初の0文字」をに「変更したい」fixed_。これと一致する行の先頭です^g1行に1回しか交換できないので省略できます。

すべてをまとめると次のようになります。

find /tmp/dir -type f | rename 's/^/fixed_/'

答え2

システムが以前のバージョンのようです。名前を変更する正規表現は使用されません。次のコマンドを使用してファイル名を変更できます

cd /tmp/dir/
for f in *\ * ; do
    [[ -f $f ]] && mv "$f" fixed_"$f"
done

(テストされていません)

~のため名前を変更する正規表現をサポートするコマンドの場合は、正規表現を変更する必要があります。*「前の作業を0回以上繰り返す」を意味する作業が必要です。何も変更したくなく、前に何かを追加したいので、^whichを使用して文字列の始まりを示します。

rename 's/^/fixed_/'

答え3

zshソリューションに興味がある人なら

 cd /tmp/dir
 for f (*(.)) mv $f fixed_$f

ここで (.) はファイルのみを意味します。

より簡単な場合

 for f (*.txt) mv $f fixed_$f

関連情報