Linux Найти команду для имена файлов без расширения для неизвестных расширений

Этот журнал показывает, что Solaris 10 загружается с существующего жесткого диска, а не с загрузочного носителя Solaris 11. (Сообщение Запуск входа в рабочий стол на дисплее: 0 ... исходит от старого диспетчера входа в систему CDE, который не включен в Solaris 11.)

Убедитесь, что вы указали системе для загрузки с компакт-диска, а не с диска, обычно вводя boot cdrom в строке ok :

4
23.01.2019, 22:02
4 ответа

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

Так и будет:

find. -type f ! -name '*.*'

Шаблон подстановки имени файла *.*будет соответствовать любому имени файла, содержащему хотя бы одну точку. Предыдущий !отрицает смысл совпадения, что означает, что пути, доходящие до конца, будут именами файлов, в именах которых нет точек. В действительно древних оболочках вы можете захотеть экранировать !как\!(или обновить вашу установку Unix ). Одинокий !не будет вызыватьbashсредство расширения истории .

Чтобы напечатать только компонент имени файла из найденного пути, с помощью GNUfind:

find. -type f ! -name '*.*' -printf '%f\n'

Со стандартнымfind(или GNU find, если уж на то пошло):

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

Прежде чем использовать это в подстановке команд в цикле, см. " Почему перебор вывода find является плохой практикой? ".


Чтобы перечислить все имена файлов и в то же время удалить все после последней точки в имени («удалить расширение» ), вы можете использовать

find. -type f -exec sh -c '
    for pathname do
        pathname=$( basename "$pathname" )
        printf "%s\n" "${pathname%.*}"
    done' sh {} +

Это приведет к отправке всех найденных путей ко всем файлам в короткий цикл оболочки. Цикл будет брать каждое имя пути и вызывать для него basename, чтобы извлечь компонент имени файла из имени пути, а затем печатать результирующую строку со всем после удаления последней точки.

Расширение параметра ${pathname%.*}означает «удалить кратчайшую строку, соответствующую.*(буквальной точке, за которой следует произвольный текст )с конца значения $pathname». Это приведет к удалению суффикса имени файла после последней точки в имени файла.

Дополнительную информацию о find... -exec... {} +см., например. " Понимание опции -exec команды `find`".

6
27.01.2020, 20:47

В Linux нет такого понятия, как расширение файла. .в имени файла не имеет никакого значения (, несмотря на то, что .в качестве первого символа в имени файла идентифицирует его как скрытый файл ).

Кроме того, проверка страницы руководства для findв моей системе не показывает опции --ignore.

Тем не менее, если вы хотите игнорировать любые файлы с .в имени, вы можете использовать findоператор -not:

find -type f -not -name '*.*' -print
4
27.01.2020, 20:47

попробуй

find. -type f \! -name '*.*' -print

где

  • \!:не (! нужно сбежать)
  • name '*.*':имя файла с расширением
1
27.01.2020, 20:47

Как указывали другие, "расширения" на самом деле ничего не значат для Unix-систем. Но мы можем удалить их из списка с помощью простой команды sed.

напр.

find * -type f -print | sed 's/\.[^.]*$//'

Если есть каталоги, и вы не хотите, чтобы они отображались в списке, тогда

find * -type f -printf "%f\n" | sed 's/\.[^.]*$//'

Для одного каталога мы можем просто использовать lsвместоfind

ls | sed 's/\.[^.]*$//'
2
27.01.2020, 20:47

Теги

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