インストール

インストール

完全な初心者ですが、ファイル名のバッチから最初のスペースを削除するコードを書こうとしています。

ターミナルに入力すると:

#!/bin/bash

for f in *.jpg; do echo mv "$f" “${f/ /}”; done

次のような結果になります:

mv R 1  Pe.jpg “R1 Pe.jpg”
mv R 10 Ma.jpg “R10 Ma.jpg”
mv R 11 An.jpg “R11 An.jpg”

しかし、エコーを削除すると、実際の名前変更は行われず、次のエラーが発生します。

for f in *.jpg; do mv "$f" “${f/ /}”; done
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

助言がありますか?

答え1

それらは引用ではありませ"

$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
    \pP \p{Pi}
    All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
       InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
       Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
       Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct


$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct

ターゲット名の引用符が適切な二重引用符ではないため、2 番目の引数はスペースで分割され、最初の コマンドは 2 つのファイルと を存在しないディレクトリ にmv移動しようとします。これがエラーの原因です。R 1 Pe.jpg“R1Pe.jpg”

それでこれを試してください:

for f in *.jpg; do echo mv "$f" "${f/ /}"; done

答え2

はい、それは引用の問題です(他の回答を参照)。

ただし、この特定の問題に関しては、コマンドを使用して実行する方が適切ですrename。(Larry Wall によるもの)

例えば

rename -n -e "s/ //" *.jpg

テスト後、出力を確認したら、を削除します-n

インストール

Debian ではapt install rename.

答え3

はい、引用符が問題です。 echo はコマンドを次のように表示します。
mv R 1 Pe.jpg “R1 Pe.jpg”
これをコマンド ラインに入力すると、ソース内のスペースが引用符で囲まれておらず、エスケープもされていないため、失敗します。 正しいコマンドは次のようになります。
mv "R 1 Pe.jpg" "R1 Pe.jpg"
$f 変数を引用符で囲むには、次のようにすることをお勧めします。
mv "\""$f"\"" "${f/ /}"
ここで、"\"" は二重引用符を印刷するためのエスケープ コードです。
つまり、次のようにecho " n " 表示されますn。 echo " \n " は n をエスケープし、改行を表示します。 同様に、echo " \" "引用符内の引用符をエスケープします。
別のオプションは次のようになります。
mv '"'$f'"' "${f/ /}"

関連情報