
こんにちは。名前にスペースが含まれるファイルがたくさんあります。それらをスペースのない新しいファイルに 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