UNIXのコマンドラインからファイル名のスペースを置換する

UNIXのコマンドラインからファイル名のスペースを置換する

こんにちは。名前にスペースが含まれるファイルがたくさんあります。それらをスペースのない新しいファイルに mv する方法はありますか。たとえば、Hello World.pdf というファイルがあり、それを Hello_World.pdf に移動したいと考えています。もちろん、1 つのファイルに対しては mv コマンドを使用できますが、フォルダー内のすべてのファイルに対して実行したいと考えています。

ありがとう

答え1

あなたはtrまたはsedこのためのコマンド:

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

これはコマンド置換に新しいPOSIX構文を使用していることに注意してください: $(指示)。
非常に古い Bourne シェルを使用している場合は、バックティックを使用する必要があります。

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

関連情報