Пропущен символ ;
для завершения первичного выражения (См. 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 -- {} +
В вашей команде отсутствует точка с запятой в конце, чтобы завершить -exec
:
find . -type f -name \*.out -exec basename {} \;
Но эта команда будет выполняться довольно медленно, потому что она вскрывает внешний процесс и вызывает basename
для каждого совпадения. Если ваша команда поддерживает опцию -printf
, то вы можете использовать вместо нее:
find . -type f -name \*.out -printf '%f\n'
-\;
find . -type f -name \*.out -exec basename {} \;
-awk
:
find . -type f -name \*.out -print | awk -F "/" '{print $NF}'