noload
не выключает журналирование. Это подавляет загрузку журнала, не выключая журналирование. Как можно предположить, это обычно - не хорошая вещь.
noload
главным образом полезно для монтирования диска как только для чтения, не изменяя его малейшим способом, даже не воспроизводя журнал. Можно считать большинство данных этот путь, и можно даже считать все данные, если журнал был сброшен (путем вызова sync
). Например, это - способ читать из файловой системы, которая в настоящее время монтируется бывшей в спящем режиме системой.
noload
май или не может быть причиной Вашей проблемы, но в любом случае это - очень плохая идея и определенно не что-то для использования в /etc/fstab
.
Если первый символ имени файла можно распечатать, но ни буквенно-цифрового, ни белого пробела, Вы можете использовать [[:punct:]]]
оператор глобуса:
$ ls *.txt
f1.txt f2.txt ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt
самое простое, которое происходит со мной, ls [^a-zA-Z0-9] *
, и он добивается цели для меня, но ответ terdon лучше в привлечении внимания к опции оболочки extglob или даже независимому от оболочки подходу.
Аналогичным подходом было бы перечислить все файлы, которые не начинаются с "обычных" символов. В bash это можно сделать с помощью
$ shopt -s extglob
$ ls !([[:alpha:]]*)
Однако, кажется, что это недоступно для fish
, поэтому вместо:
$ find . -type f -not -name '[[:alpha:]]*'
Я не использую Рыба
, но документация говорит, что вы можете ввести символ Unicode, префиксировав свой шестнадцатеричный код символа с \ U
(для 16-битных символов) или \ U
(для 32-битных символов). Я думаю, что код для ♫
491EB
, поэтому вы можете сделать:
mv \U000491ebabc.mp3 abc.mp3
для переименования ♫ abc.mp3
.
Обратите внимание, что вам нужны ведущие нули, в противном случае ABC
в конце будет рассматриваться как шестнадцатеричные цифры, а также часть кода символов; Для 32-разрядного персонажа необходимо ввести 8 цифр.
Вы не говорили, хотите ли вы сохранить эти проблемные имена файлов. Одно решение может быть «исправить» проблему один раз и для всех, переименовав (Некоторые или все) ваши файлы на имена, которые вы можете ввести, запустив этот скрипт:
#!/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.
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!'
Один из подходов к работе с именами файлов со специальными символами - в качестве первых символов или в другом месте имени файла - это переименование на более простые имена.
Это может быть использовано, даже если вам необходимо сохранить оригинальные имена файлов: Переименовать копию имени файла.
Это может быть сделано путем копирования файлов, а также создания симлинков или жестких ссылок на файлы и их переименования. cp
создает симлинки вместо копий с опцией -s
(-l
для жестких ссылок).
Для переименования для очистки имен файлов можно использовать detox
; он переименовывает файлы для очистки имен файлов в соответствии с различными правилами, определенными в файле detoxrc
. По умолчанию символы UTF8 просто удаляются; с опцией -s utf_8-only
они заменяются на _
:
$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only *
$ ls -1
_ ___
_foo
в сочетании с работой с симлинками, как описано выше:
$ 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
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 использует другую терминологию (расширение параметров и имен файлов ).