安装中

安装中

这里是初学者,尝试编写一些代码来删除一批文件名中的第一个空格。

当我在终端输入:

#!/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/ /}"

相关内容