Удаление апострофа из всех имен файлов

Я попытался удалить апостроф из всех имен файлов в каталоге.

for i in *; do mv $i `echo $i | tr -d "'"`; done 

После выполнения этой команды ничего не переименовывается.

Вы знаете, что здесь не так?

  • Удалить строку из имени файла, чтобы оставить переменную?
  • Как изменить ввод сценария в качестве первого аргумента в CLI?
  • Найти и заменить строку в именах каталогов
  • Можно ли использовать утилиту Rename для упрощения этого скрипта, который использует Find и Mv?
  • Переименование файлов в локальной папке с добавлением префикса или суффикса
  • Переместить с возможным переименованием
  • Как удалить точку и пробел с начала имен файлов
  • Разделить имена файлов и переименовать
  • 3 Solutions collect form web for “Удаление апострофа из всех имен файлов”

    Вы можете попробовать что-то вроде этого ( bash ):

     shopt -s nullglob for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done 

    Это использует замену строки оболочки. Вы, вероятно, не хотите, чтобы файлы glob, которые не имеют в них, поскольку mv потерпит неудачу. Без опции nullglob сам шаблон glob будет передан mv если нет соответствующих файлов.

    Всегда ставьте двойные кавычки вокруг переменных подстановок $foo и подстановок $(foo) (если вы не знаете, почему вам нужно их оставить и почему это нормально).

     for i in *; do mv "$i" "$(echo "$i" | tr -d "'")"; done 

    Это будет работать в основном с несколькими ограничениями:

    • Вы получите плохое поведение или ошибки, если имя файла начинается с - , потому что mv будет интерпретировать его как параметр.
    • Это не влияет на файлы, имя которых начинается с . ,
    • При некоторых настройках это приведет к искажению обратных косых черт в команде echo .
    • Новые строки в конце имени теряются.

    В ksh93, bash и zsh вы можете написать это с меньшими затратами, используя конструкцию ${VARIABLE//PATTERN/REPLACEMENT} . Добавление -- в mv имена файлов, начиная с - . Если у вас есть имена файлов, начиная с . , добавьте .* или .[^.]* ..?* после * мере необходимости.

     for i in *; do mv -- "$i" "${i//\'/}"; done 

    В zsh вы можете использовать zmv :

     zmv '(*)' "\${1//\\'/}" 

    В Debian, Ubuntu и других производных вы можете использовать rename Perl-скрипт.

     rename "s/'//g" * 

    Я предполагаю, что ваша проблема заключается в том, что в файле также есть пробелы. Я не могу воспроизвести вашу ошибку без нее.

     $ touch "file" "user's file" $ for i in *; do mv $i `echo $i | tr -d "'"`; done mv: `file1' and `file1' are the same file mv: target `file' is not a directory 

    Поэтому причиной отказа является второе сообщение: target 'file' is not a directory .

    Когда ваш цикл for видит файл с пробелом, он запускает это:

     mv user's file users file 

    Поэтому он считает, что вы указываете три файла ( user's , file и users ) и каталог для перемещения этих файлов в file .

    Правильное цитирование обоих должно решить вашу непосредственную проблему

     $ for i in ./*; do mv "$i" "$(echo "$i" | tr -d "'")"; done 
    Linux и Unix - лучшая ОС в мире.