Контакт с именами файлов со специальными первыми символами (напр. ♫)

noload не выключает журналирование. Это подавляет загрузку журнала, не выключая журналирование. Как можно предположить, это обычно - не хорошая вещь.

noload главным образом полезно для монтирования диска как только для чтения, не изменяя его малейшим способом, даже не воспроизводя журнал. Можно считать большинство данных этот путь, и можно даже считать все данные, если журнал был сброшен (путем вызова sync). Например, это - способ читать из файловой системы, которая в настоящее время монтируется бывшей в спящем режиме системой.

noload май или не может быть причиной Вашей проблемы, но в любом случае это - очень плохая идея и определенно не что-то для использования в /etc/fstab.

30
07.10.2014, 18:36
9 ответов

Если первый символ имени файла можно распечатать, но ни буквенно-цифрового, ни белого пробела, Вы можете использовать [[:punct:]]] оператор глобуса:

$ ls *.txt
f1.txt  f2.txt  ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt
35
27.01.2020, 19:38

самое простое, которое происходит со мной, ls [^a-zA-Z0-9] * , и он добивается цели для меня, но ответ terdon лучше в привлечении внимания к опции оболочки extglob или даже независимому от оболочки подходу.

6
27.01.2020, 19:38

Аналогичным подходом было бы перечислить все файлы, которые не начинаются с "обычных" символов. В bash это можно сделать с помощью

$ shopt -s extglob
$ ls !([[:alpha:]]*)

Однако, кажется, что это недоступно для fish, поэтому вместо:

$ find . -type f -not -name '[[:alpha:]]*'
5
27.01.2020, 19:38

Использование ZSH и введите то, что находит дальше. ZSH поддерживает нечеткую автоматическую работу и может иметь дело с ним. (Это особенно приятно с плагином oh my-ZSH .)

1
27.01.2020, 19:38

Я не использую Рыба , но документация говорит, что вы можете ввести символ Unicode, префиксировав свой шестнадцатеричный код символа с \ U (для 16-битных символов) или \ U (для 32-битных символов). Я думаю, что код для 491EB , поэтому вы можете сделать:

mv \U000491ebabc.mp3 abc.mp3

для переименования ♫ abc.mp3 .

Обратите внимание, что вам нужны ведущие нули, в противном случае ABC в конце будет рассматриваться как шестнадцатеричные цифры, а также часть кода символов; Для 32-разрядного персонажа необходимо ввести 8 цифр.

2
27.01.2020, 19:38

Вы не говорили, хотите ли вы сохранить эти проблемные имена файлов. Одно решение может быть «исправить» проблему один раз и для всех, переименовав (Некоторые или все) ваши файлы на имена, которые вы можете ввести, запустив этот скрипт:

#!/bin/sh
for old in *
do
      printf "%s ...? " "$old"
      if read new  &&  [ "$new" != "" ]
      then
             mv -i "$old" "$new"
      fi
done

Это перечисляет ваши существующие имена файлов, каждый из которых следует ...? . Просто введите Введите , чтобы оставить файл как есть; или введите новое имя, чтобы переименовать его. Вариант -I заставит его попросить вас подтвердить перезапись Если вы укажете имя другого существующего файла.

Этот скрипт может быть изменен несколькими способами:

  • Вы можете изменить подстановочный знак ( * ) к чему более ограничительно, E.G., *. AVI * .mov , поэтому вам не нужно смотреть на каждый файл.
  • Вы можете изменить MV на CP , Таким образом, вы сохраняете копию файла с его текущим именем и создать (временную?) Копировать с типом именем.
  • Вы можете создать новое имя файла, основанное на существующем именем файле. Например,

     если прочитать PFX && [«$ PFX»! = ""]
    тогда
      MV -I «$ старый» "$ pfx $ alt"
    фигурировать
     

    , который позволяет ударить префикс перед старым именем. Если вы выбрали уникальный префикс, это позволит вам использовать Auto-Complete.

0
27.01.2020, 19:38

LS имеет некоторые коммутаторы (например, - quote-name, - eescape, --lierteral) для решения проблем с неразъемными персонажами, но в этом случае кажется, что персонаж «печатный», но не «типируемый» (хотя бы на Моя клавиатура!), поэтому ни один из этих переключателей, кажется, не помогает.

Следовательно, в качестве общего подхода «грубой силы», чтобы избавиться от файлов с любыми символами в их именах, вы можете сделать это:

$ /bin/ls -1A|cat -n  # list all files (except . and ..), 1 per line, add line numbers
     1  ♫
     2  f1.txt
     3  f2.txt

Найдите строку, содержащую файл оскорбления. Вполне вероятно, что это будет 1-я строка, но скажем, это 5-го. Line Print 5 и Hex кодируют его:

$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a                                      ....

Игнорирование символа 0a (Newline), построить escape String и используйте опцию echo, чтобы перевести escapes:

$ echo -e '\xe2\x99\xab'
♫

Теперь вы можете скопировать / переместить / удалить его как Это:

$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’

также, если вы не ограничиваетесь использовать сценарий Shell, вы можете сделать это в Python, как это:

$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')

Используя этот подход, вы можете обработать много файлов, вам просто нужно написать логику для выбора Правильные файлы и переименование их без нажатия и т. Д.:

for f in os.listdir('.'):
  if not f.isalnum():
    newname = generate_newname(f)
    if not os.path.exists(newname):
      shutil.copy(f, newname)
    else:
      print newname, 'already exists!'
6
27.01.2020, 19:38

Переименование симлинков

Один из подходов к работе с именами файлов со специальными символами - в качестве первых символов или в другом месте имени файла - это переименование на более простые имена.

Это может быть использовано, даже если вам необходимо сохранить оригинальные имена файлов: Переименовать копию имени файла.
Это может быть сделано путем копирования файлов, а также создания симлинков или жестких ссылок на файлы и их переименования. cp создает симлинки вместо копий с опцией -s (-l для жестких ссылок).

Используйте "detox" для очистки имен

Для переименования для очистки имен файлов можно использовать detox ; он переименовывает файлы для очистки имен файлов в соответствии с различными правилами, определенными в файле detoxrc . По умолчанию символы UTF8 просто удаляются; с опцией -s utf_8-only они заменяются на _:

$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only * 
$ ls -1                
_ ___
_foo


"detox" на симлинках

в сочетании с работой с симлинками, как описано выше:

$ mkdir orig
$ cd orig 
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean 
$ cp -s ../orig/* .
$ ll               
lrwxrwxrwx 1 14 Oct  8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct  8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll                                
lrwxrwxrwx 1 21 Oct  8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct  8 05:52 _foo -> ../orig/♫foo
4
27.01.2020, 19:38

Fish не поддерживает подстановочные знаки скобок ¹ по своей конструкции.

function find_special_filename
    find ! -path './.*' -name '[^-.a-zA-Z0-9_]*' $argv
end

Команда не выполняет поиск в скрытых каталогах и отображает имена файлов, которые не начинаются с символов letters, digits,._-(ср. документацияfind).

Примечание:$argv— это специальная переменная массива (Fish shell ), которая содержит аргументы функции, поэтому базовая команда может принимать любое выражение (, например. псевдоним).

find_special_filename -exec mv '{}' misc/ \;

¹ На самом деле, Fish поддерживает расширение скобок (расширение переменных массива ), но Bash использует другую терминологию (расширение параметров и имен файлов ).

2
27.01.2020, 19:38

Теги

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