ls * .pdf жалуется: ls: неверный параметр - '_'

411
nate

Я привык использовать 'ls', как в Linux Mint, например, 'ls * .pdf', но в этом варианте Debian 'ls .pdf' жалуется. Я использую длину 'find -maxdepth 1 -type f -name' .pdf" -print'.

Чтение этого: странная работа не слишком помогает. У меня есть пакет bash_completions, и у меня нет странных псевдонимов для 'ls' в моем файле ~ / .bashrc - я никогда не редактирую / etc / profile или глобальный, где бы он ни находился.

Просто догадываясь, я применил решение в связанном вопросе, но оно не сработало. Я не полностью понимаю «завершено» - я думаю, что это часть «readline» - так что, возможно, краткое объяснение тоже поможет (у него нет страницы «man»).

Это работает, хотя: «complete -p ls * .pdf», что «complete --help» говорит,

 -p print existing completion specifications in a reusable format 

и поэтому мне интересно, должен ли я постоянно применять это «правило»? используя флаг '-D' ...?

РЕДАКТИРОВАТЬ

Просто заметил эту проблему тоже:

for f in *.pdf; do mv "$f" "BOOK - $F"; done  mv: invalid option -- 'R' 

РЕДАКТИРОВАТЬ 2

Я попробовал две команды выше, и они отлично работают - на разделе моей ОС. Проблема в том, что когда я перехожу на другой раздел с работающим Linux Mint и файлами PDF, которые я хочу изменить, эти команды не выполняются. Оба раздела имеют формат ext4, оба имеют одинаковые имя пользователя, имя хоста, UID / GID, разрешения и т. Д.

0

2 ответа на вопрос

1
Gilles Quenot

Кажется, что у вас есть имена файлов с начальным тире -, поэтому используйте:

for f in *.pdf; do mv -- "$f" "BOOK - $F"; done 

От man bash:

A --сигнализирует об окончании опций и отключает дальнейшую обработку опций. Любые аргументы после - обрабатываются как имена файлов и аргументы. Аргумент - эквивалентен -.

Это какая-то магия Баш? Я не вижу этого на странице руководства для mv ... nate 6 лет назад 0
Это не специфично для mv, но для shell, это означает _end of options_ Gilles Quenot 6 лет назад 1
@nate, см. [это] (https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html) для получения дополнительной информации. TL; DR: это соглашение, выдвинутое GNU libc (стандартная библиотека C, обычно используемая в системах на основе Linux) и утилитами core / file, написанными с его помощью. Соглашение вроде застряло (навсегда). kostix 6 лет назад 0
Я также объяснил бы, * почему * наблюдается наблюдаемое поведение. Оболочки Unix (в отличие от Windows) сами по себе расширяют «подстановочные знаки»; то есть, когда вы запускаете `some_command * .pdf` в вашей оболочке, оболочка видит этот` * .pdf` и пытается сопоставить набор файлов в своем текущем каталоге; если это произойдет, команде some_command будет передано * несколько отдельных * аргументов, каждый из которых является именем соответствующего файла. Если сопоставление не удалось (файлы не найдены), аргумент будет передан как есть - `* .pdf`. kostix 6 лет назад 0
… Как следствие, вы могли бы даже иметь файлы с именами `--`,` -a` и `-b` и вызывать` some_command - * `с некоторыми интересными (и непредсказуемыми, от запуска к выполнению) результатами ;-) Что Я веду к тому, что для производственного кода вы почти всегда захотите `find $ dir -type f -name '* .pdf' -print0 | xargs -0 -n 1 some_command` kostix 6 лет назад 0
1
Ivan

Если у вас есть имена файлов, начинающиеся с -(минус или дефис), многие программы интерпретируют их как параметры.

Вы можете ./перейти к пути, чтобы избежать его:

ls ./*.pdf 

Многие программы также позволяют вставлять --перед аргументами имя файла, чтобы сигнализировать об окончании параметров:

ls -- *.pdf 

Рекомендуемый подход для пользователей - конечно, переименовать файлы.

О, я вижу. Так что простое имя файла, начинающееся с тире, вызвало эти ошибки. Я нашел и переименовал его, и теперь он работает. nate 6 лет назад 0

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