从 cmd 行 unix 替换文件名中的空格

从 cmd 行 unix 替换文件名中的空格

您好,我有一堆文件名带空格的文件,有没有办法将它们移动到不带空格的新文件。例如,我有文件 Hello World.pdf,我想将其移动到 Hello_World.pdf。显然,对于一个文件,我可以使用 mv 命令,但我想对文件夹中的所有文件执行此操作。

谢谢

答案1

您可以使用tr或者sed命令如下:

for file in *.pdf
do
    newname=$(echo $file | tr ' ' _)
    mv "$file" $newname
done

请注意,这使用了较新的 POSIX 语法进行命令替换:$(命令)。
如果您使用的是较旧的 Bourne shell,则需要使用反引号:

newname=`echo $file | tr ' ' _`

答案2

以下是我用于此任务的几个脚本:

#!/bin/ksh
# Name     : unspace - replace spaces by underscores in file names
# Usage    : unspace [file ...]
# Example  : unspace *.doc
unspace()
{
  ls "$@" | while a=$(line)
  do
    file=$(echo $a | grep " ")
    if [ -n "$file" ]
    then
      file="$(print "$file" | sed 's/ /_/g')"
      print "$a" "->" "$file"
      mv "$a" "$file"
    fi
  done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"

下面的代码递归地修复当前目录下的所有名称。请注意,如果目录名称中也包含嵌入空格,则仍需要做一些工作。

#!/bin/ksh
find . |
  while a=$(line)
  do
          newName="$(print $a | tr ' ' '_')"
          if [ "$a" != "$newName" ]
          then
                  mv "$a" "$newName"
                  print $a moved
          else
                  print $a unchanged
          fi
  done

答案3

如果你有 bash,则无需调用外部工具

for file in *.pdf
do 
  if [ -f "$file" ];then
     echo mv "$file" "${file// /_}"
  fi
done

相关内容