まず、ファイル名のバッチから最初のスペースを削除するコードを書いてみましょう。
端末に入力するとき:
#!/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
“R1
Pe.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変数の周りにquitを入れるには、次のようにします。
mv "\""$f"\"" "${f/ /}"
ここで、 "\"は二重引用符を印刷するエスケープコードです。
例:echo " n "
display n
. echo " \ n "はnをエスケープ同様に改行を表示します、echo " \" "
引用符の中に引用符をエスケープする
ことは次のとおりです。
mv '"'$f'"' "${f/ /}"