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

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

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

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

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

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 
  • как я могу настроить таргетинг на имена файлов с двумя цифрами с помощью инструмента переименования?
  • Как перемещать все файлы и папки с помощью команды mv
  • Как переименовать несколько файлов с префиксом и суффиксом с помощью команды find
  • Как настроить разделы SSD и HDD с помощью RAID?
  • Когда мы используем команду mv, какие изменения происходят на HDD?
  • Найти и заменить строку в именах каталогов
  • Рекурсивно переименовывать файлы и каталоги
  • Переименование файлов и переход на другой путь
  • Как сохранить один файл в каталоге?
  • Как я могу найти файлы, а затем использовать xargs для их перемещения?
  • Пакетное переименование файлов
  • Interesting Posts

    Как я могу позволить людям установить мой пакет с помощью apt-get?

    Разъем для наушников в звуковом гнезде как вход X

    lightdm не запускается правильно при загрузке (работает с терминала)

    Тема выглядит по-разному в зависимости от местоположения в FS?

    Могу ли я использовать `sed` для перевода символов, например, с помощью` tr`?

    Возможно ли, чтобы nohup записывал выходные данные как в файл nohup.out AND, так и на экран / терминал?

    Как получить IP-адреса возможных злоумышленников ssh?

    поддерживаемая графическая карта

    Как уменьшить количество fsync, которое выполняет mysql?

    Будет ли chmod 000 / dev / stdin отключить терминал навсегда?

    как вернуться к базовому скрипту из хвоста -f

    Исправить разделение разделов во FreeBSD

    Ошибка ATA: сбой COMRESET (errno = -32)

    Как распределять файлы / пакеты / программное обеспечение на нескольких дисках?

    Почему сглаживание над стандартными командами не рекомендуется?

    Linux и Unix - лучшая ОС в мире.