macOSでfindとmvを使用してディレクトリの名前を変更する

macOSでfindとmvを使用してディレクトリの名前を変更する

ディレクトリとファイルの名前を変更するコマンドで問題が発生しています。

  • オペレーティングシステム:MACOS 11.4
  • 目的:スペースをアンダースコアに変更するディレクトリとファイルの名前を変更する_
  • 試してみるコマンド:
    find . -maxdepth 1 -iname "* *" -exec sh -c 'fichier="{}"; mv -- $fichier ${fichier// /_}' \;
    

find私は一度に1レベルの深さのディレクトリツリーをナビゲートできるようにしたいので、これを使います。

このコマンドの結果は次のとおりです。

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

だからmv私はechoコマンドをチェックするために使用しません

find . -maxdepth 1 -iname "* *" -exec sh -c 'fichier="{}"; echo $fichier ${fichier// /_}' \;

これは期待通りに動作するようです。

./Job offers etc ./Job_offers_etc
./School results ./School_results
./Famille et Souvenirs ./Famille_et_Souvenirs
./KID education ./KID_education
./Template Open Office-MS Office ./Template_Open_Office-MS_Office
./Mode Emplois ./Mode_Emplois
./cartres de voeux ./cartres_de_voeux

私がそれを使用したときに何が間違っていましたかmv

ベストアンサー1

現在経験している状況は、これが推奨される理由の1つです。(ほぼ)常にシェル変数を引用します。

あなたの場合、シェル変数にfichierスペースを含むファイル名を指定したので、変数を「現状のまま」使用すると、シェルはトークン化を実行します。つまり、引数であるディレクトリは次のようになります$fichier。 3つのファイルを宛先ディレクトリに移動します(1)Job offers etcmvJoboffersetcJob_offers_etc

この問題を回避するには、に示すように変数参照の周りに二重引用符を入れます"$fichier"


(1)これは実際に危険です。ターゲットディレクトリが存在しない場合、このコマンドは3つのファイル名を同じ名前に変更して、最初の2つのファイルを3番目のファイルで上書きできます。

おすすめ記事