Удалить "?" символ из многих имен файлов в одном каталоге

Я столкнулся с той же проблемой. Поскольку ранее был установлен virtualboxиз репозиториев Mint по умолчанию, я попытался установить текущий выпуск непосредственно из https://www.virtualbox.org/

.

Таким образом, я снова смог запускать виртуальные машины.

0
04.01.2020, 00:10
2 ответа
rename 's/\?//g' *

кто бы переименовал все файлы

francois@zaphod:~/tmp$ ls
toto_?_  toto_?_1  toto_?_2

francois@zaphod:~/tmp$ rename 's/\?//g' *
francois@zaphod:~/tmp$ ls
toto__  toto__1  toto__2
francois@zaphod:~/tmp$
0
28.01.2020, 02:58

Предполагая bashили любую подобную оболочку, которая знает, как заменить все вхождения строки, соответствующей шаблону в значении переменной, на ${variable//pattern/replacement}(, например. zshилиksh):

for name in./*'?'*; do
    mv -i "$name" "${name//'?'/}"
done

Это короткий цикл, в котором перебираются все имена в текущем каталоге, содержащие хотя бы одно?(скрытое имя ). Для каждого такого имени символы ?удаляются из имени файла, и результат используется в качестве нового имени файла.

Одинарные кавычки вокруг ?в шаблонах не позволяют рассматривать его как специальный символ подстановки, который соответствует любому одиночному символу (, что и делает ?без кавычек ). Вы также могли бы использовать \?или [?].

Если знаки вопроса, которые вы видите, взяты из вывода ls, то они могут представлять собой непечатаемые -символы.

Чтобы удалить эти , замените каждый '?'в приведенном выше коде на [![:print:]]. Подстановочный шаблон [![:print:]]соответствует непечатаемому символу. Класс символов [:print:]похож на [:graph:],но первое соответствует символу пробела, а второе — нет. Следовательно, использование [![:print:]]приведет к удалению пробелов , а не , а использование [![:graph:]]удалит пробелы.

0
28.01.2020, 02:58

Теги

Похожие вопросы