Недавно я натолкнулся на файл, имя которого начинается с символа «♫». Я хотел скопировать этот файл, ffmpeg
вставить его и ссылаться на него различными другими способами в терминале. Я обычно автоматически заполняю странные имена файлов, но это не удается, поскольку я даже не могу набрать первую букву.
Я не хочу переключаться на мышь, чтобы выполнить маневр копирования-вставки. Я не хочу запоминать кучу кодов для возможных сценариев. Мое специальное решение состояло в том, чтобы переключиться vim
, вставить !ls
и скопировать соответствующий символ, а затем выйти и вставить его в терминал. Это сработало, но довольно ужасно.
Есть ли более простой способ справиться с такими сценариями?
ПРИМЕЧАНИЕ: я использую рыбную раковину, если она что-то меняет.
источник
*restoffile.avi
или как то так?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Ответы:
Если первый символ имени файла печатается, но не содержит буквенно-цифровых символов или пробелов, вы можете использовать
[[:punct:]]
оператор glob:источник
Самое простое, что приходит мне в голову, это
ls [^a-zA-Z0-9]*
то, что мне нужно, но ответ Тердона лучше привлечь внимание к опции оболочки extglob или даже к независимому от оболочки подходу.источник
ls [^[:alnum:]]*
за то же самое. Но это лучше использовать класс символов , то есть , а не класс (ы) это не ; следовательноls [[:punct:]]*
, перечислю этот файл.У ls есть несколько ключей (например, --quote-name, --escape, --literal) для работы с непечатаемыми символами, но в этом случае кажется, что символ «печатается», но не «печатается» (по крайней мере, на моей клавиатуре! ), так что ни один из этих ключей, кажется, не помогает.
Следовательно, в качестве общего подхода «грубой силы» для избавления от файлов с любыми символами в именах, вы можете сделать это:
Найдите строку, содержащую поврежденный файл. Вполне вероятно, что это будет 1-я строка, но, скажем, 5-я. Выведите строку 5 и закодируйте ее шестнадцатерично:
Игнорируя символ 0a (перевод строки), создайте escape-строку и используйте параметр -e echo для перевода escape-символов:
Теперь вы можете скопировать / переместить / удалить его так:
Кроме того, если вы не ограничены использованием сценария оболочки, вы можете сделать это на Python следующим образом:
Используя этот подход, вы можете обрабатывать много файлов, вам просто нужно написать логику для выбора правильных файлов и переименования их без зазубрин и т. Д .:
источник
Аналогичным подходом будет перечисление всех файлов, которые не начинаются с «обычных» символов. В Bash вы можете сделать это с
Тем не менее, это, кажется, не доступно
fish
, так что вы можете использоватьfind
вместо:источник
Переименовать символические ссылки
Один из подходов к обработке имен файлов со специальными символами - в качестве первых символов или где-либо еще в имени файла - переименовать в более простые имена .
Это может быть использовано, даже если вам нужно сохранить исходные имена файлов : Переименуйте копию имен файлов.
Это можно сделать путем копирования файлов, а также путем создания символических или жестких ссылок на файлы и их переименования.
cp
создает символические ссылки вместо копий с опцией-s
(-l
для жестких ссылок).Используйте «Детокс» для очистки имен
Для переименования, чтобы очистить имена файлов,
detox
могут быть использованы; Он переименовывает файлы для очистки имен файлов в соответствии с различными правилами, определенными вdetoxrc
файле. По умолчанию символы UTF8 просто удаляются; С возможностью-s utf_8-only
они заменяются на_
:"Детокс" по символическим ссылкам
В сочетании с работой над символическими ссылками, как описано выше:
источник
Я не использую
fish
, но в документации сказано, что вы можете ввести символ Unicode, добавив префикс его шестнадцатеричного кода\u
(для 16-разрядных символов) или\U
(для 32-разрядных символов). Я думаю , что код♫
является491eb
, так что вы можете сделать:переименовать
♫abc.mp3
.Обратите внимание, что вам нужны начальные нули, иначе
abc
в конце будут рассматриваться как шестнадцатеричные цифры и часть кода символа; для 32-разрядного символа необходимо ввести 8 цифр.источник
Я не знаю, было ли это уже в 2014 году, когда вы задали вопрос, но в текущих версиях
fish
(по состоянию на 2019) вы можете нажать Tabдважды, чтобы получить выбор в стиле zsh, в котором вы можете использовать клавиши со стрелками для визуально выберите нужный файл без необходимости вводить какую-либо часть имени файла.источник
Рыба не поддерживает символы-скобки design по дизайну.
Команда не выполняет поиск в скрытых каталогах и отображает имена файлов , которые не начинаются с символов
letters
,digits
,.
_
-
(см документацииfind
).Примечание:
$argv
это специальная переменная массива (Fish shell), которая содержит аргументы функции, поэтому основная команда может получить любое выражение (например, псевдоним ).¹ На самом деле, рыба поддерживает расширение кронштейна (расширение переменного массива) , но Bash использует другую терминологию (параметр и имя файла расширение).
источник
Используйте
zsh
и введите то, что будет дальше. ZSH поддерживает нечеткое автозаполнение и может справиться с этим. (Особенно хорошо с плагином OH-MY-ZSH .)источник
Вы не сказали, хотите ли вы сохранить эти проблемные имена файлов. Одним из решений может быть «исправить» проблему раз и навсегда, переименовав (некоторые или все) ваши файлы в имена, которые вы можете ввести, запустив этот скрипт:
Это будет список ваших существующих имен файлов, за которыми следуют
...?
. Просто введите, Enterчтобы оставить файл как есть; или введите новое имя, чтобы переименовать его.-i
Опция заставит это попросить вас подтвердить перезапись , если указать имя другого существующего файла.Этот скрипт может быть изменен несколькими способами:
*
) на что-то более ограничительное, например*.avi *.mov
, чтобы вам не приходилось смотреть на каждый файл.mv
чтобыcp
, таким образом вы сохраните копию файла с текущим именем и создать (временно?) Скопировать с печатаемым именем.Вы можете создать новое имя файла на основе существующего имени файла. Например,
который позволяет вам ударить префикс перед старым именем. Если вы выбрали уникальный префикс, это позволит вам использовать автозаполнение.
источник