安裝中

安裝中

這裡是初學者,嘗試編寫一些程式碼來刪除一批檔案名稱中的第一個空格。

當我在終端輸入:

#!/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”

但是當我刪除 echo 時,實際的重命名不會發生,我收到此錯誤:

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

由於目標名稱中的引號不是正確的雙引號,因此第二個參數將在空格上分割,第一個 mv命令將嘗試將兩個檔案移動R 1 Pe.jpg“R1不存在的目錄Pe.jpg”。這就是導致錯誤的原因。

所以試試這個:

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

答案2

是的,這是一個引用問題(請參閱其他答案)。

但是對於這個特定問題,最好使用命令來完成rename。 (拉里·沃爾的那首)

例如

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 " 顯示n. echo " \n " 轉義n 並顯示換行符類似地,echo " \" "轉義引號內的引號
是:
mv '"'$f'"' "${f/ /}"

相關內容