我命名了一些带有空格的文件,我想用 替换空格_
。但是,每次我在 shell 中用文件名写入命令(例如Spring 2011
)时,shell 都无法识别该文件或目录。
我该怎么办? 有没有办法使用 unicode 字符作为空格?
答案1
转义空格,例如Spring\ 2011
,或使用引号,例如'Spring 2011'
。将来,在任何 *NIX 上使用带有空格的文件名通常都是一个坏主意。
如果你有rename
,你可以使用它:
rename ' ' '_' [filenames...]
答案2
如果你没有rename
或者只想使用 shell:
for f in *\ *; do mv "$f" "${f// /_}"; done
细分如下:
*\ *
选择名称中带有空格的所有文件作为循环的输入for
。该模式*X*
选择X
名称中带有空格的所有文件,对于特殊字符空格,我们必须使用斜线对其进行转义,以便 bash 不会将其视为分隔不同参数。- 周围的引号
"$f"
很重要,因为我们知道文件名中有一个空格,否则它会显示为 2+ 个参数mv
。 ${f//str/new_str}
是 bash 特有的字符串替换功能。 的所有实例都str
将被替换为new_str
。
答案3
如果您的机器有改名命令,则会将当前工作目录中所有文件/目录中的所有空格更改为下划线:
rename 's/ /_/g' *
答案4
要以编程方式重命名 N 个文件,可以使用简单的bash
for 循环。
#!/bin/bash
set -eux
# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here
# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS
# for each filename
for filename in "${tmp[@]}"; do
# rename the filename to use "_" character instead of a " " character
mv -v "${filename}" "${filename// /_}"
done
如果文件名少于 5 个,则可以手动输入所有文件名,然后使用rename
类似上述命令解决方案建议。但对我来说...我更喜欢程序化解决方案...即使只有 4 个文件。
附言
如果您不熟悉的Bash
参数扩展(即${filename// /_}
),您可以使用以下rename
命令:
if ((0)); then
mv -v "${filename}" "${filename// /_}"
else
rename ' ' '_' "${filename}"
fi