Как распечатать основное использование имени файла, находят в Unix?

[12203] привязка -p[115322] дает текущую привязку. Вы увидите, что [115323]Ctrl+W[115324] привязан к [115325] unix-word-rubout[115326] и [115327]Alt+D[115328] к [115329] киллу [115330]: [12204] Если вы сделаете привязку [115331] к -p | grep kill-word [115332], вы найдете: [12205] Некоторые терминалы посылают [115333] ^H[115334] на [115335] Backspace[115336] и некоторые другие [115337] ^? [115338], вот почему есть два переплета. Поэтому [115339]Alt+Backspace[115340] должен быть тем, что убивает слово назад, по крайней мере, на тех клеммах, где [115341]Alt+X[115342] посылает символ [115343]ESC[115344], за которым следует [115345]X[115346]. Однако есть несколько терминалов, которые посылают [115347]X[115348] с установленным 8-м битом (0xD8) на [115349]Alt+X[115350] (хотя они становятся все реже и реже, так как в этом новом мире UTF-8 не так уж много смысла). В них вы должны нажать [115351]Esc[115352], а затем [115353]Backspace[115354], или вы можете установить [115355]convert-meta[115356] в [115357] на [115358] в конфигурации считывания (например, с помощью [115359]привязать 'set convert-meta on'[115360]), но тогда вы не сможете ввести не-ascii символы.[114836].
1
21.11.2014, 09:36
3 ответа

Пропущен символ ; для завершения первичного выражения (См. POSIX find):

find . -type f -name \*.out -exec basename {} ';'

Причина, по которой вы должны экранироваться, или процитировать ;, потому что это ваш разделитель списков оболочек. Вы должны заставить вашу оболочку обращаться с ним буквально. \;, ';' или ";" все работает хорошо.

Но это решение вызовет basename для каждого найденного файла, сделает его медленным. Если имена файлов не содержат новой строки, вы можете:

find -type f -name '*.out' | sed -e '#.*/##'

Если у вас версия GNU coreutils >= 8.16, или вы работаете на OSX, вы можете использовать basename -a:

find -type f -name '*.out' -exec basename -a -- {} +
6
27.01.2020, 23:11

В вашей команде отсутствует точка с запятой в конце, чтобы завершить -exec:

find . -type f -name \*.out -exec basename {} \;

Но эта команда будет выполняться довольно медленно, потому что она вскрывает внешний процесс и вызывает basename для каждого совпадения. Если ваша команда поддерживает опцию -printf, то вы можете использовать вместо нее:

find . -type f -name \*.out -printf '%f\n'
4
27.01.2020, 23:11

-\;

 find . -type f -name \*.out -exec basename {} \;

-awk:

find . -type f -name \*.out -print | awk -F "/" '{print $NF}'
2
27.01.2020, 23:11

Теги

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