5

Привет у меня есть куча файлов с пробелами в имени, есть ли способ, чтобы mv их в новые файлы без пробелов в. Например, у меня есть файл Hello World.pdf. Я хочу переместить его в Hello_World.pdf. Очевидно, что для одного файла я могу использовать команду mv, но я хочу сделать это для всех файлов в папке.

Спасибо

3 ответа3

9

Вы можете использовать команды tr или sed для этого:

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

Обратите внимание, что для подстановки команд используется новый синтаксис POSIX: $(команда).
Если вы используете действительно старую оболочку Bourne, вам нужно использовать обратные пометки:

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

Вот несколько сценариев, которые я использую для этой задачи:

#!/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
0

если у вас есть bash, не нужно вызывать внешние инструменты

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .