Golang имя файла без расширения

Обновлено: 04.07.2024

Может кто-нибудь сказать мне, как использовать grep в этом случае?

Цель: у меня есть текстовый файл, где перечислены все имена без расширения. Я хочу сделать скрипт, который сравнивает текстовый файл с папкой, чтобы увидеть, какой файл отсутствует.

Вы хотите быть осторожным с такой просьбой. Linux не имеет расширений файлов. В Linux есть имена файлов, которые могут включать или не включать . в них. Хотя в соглашении говорится, что имена файлов .jpg должны указываться в конце, нет причины, по которой у меня не может быть файла png с именем foo.zip or my.picture.20160518 or just mypic . @hymie Я знаю, но все мои элементы в этой папке названы в конце .jpg. Что такое "расширение"? Это не часть имен файлов Unix; это перенос из VMS / NT / Windows, что угодно. И вы, ребята, тоже сойдите с моей лужайки. :) Давайте не будем преувеличивать это. ОС рассматривает расширения как просто часть имени файла, но на них обращает внимание множество программ unix, от компилятора до графического интерфейса. Концепция, безусловно, не чужды unix. Обычно рекомендуется избегать синтаксического анализа выходных данных ls и передавать по конвейеру выходные данные, ls и find , главным образом, из-за возможности использовать newline символ `tab char в имени файла. Если имя файла The new art of working on .jpg\NEWLINE files and other formats много, предлагаемое решение создаст проблемы.

Вам нужна только оболочка для этой работы.

Там нет необходимости printf ; echo $ будет достаточно. @Conrad: использование echo не будет работать должным образом в некоторых случаях, если имя файла начинается с тире или содержит экранированные последовательности.

Команда sed удаляет (то есть заменяет пустую строку) любую строку, .jpg найденную в конце имени файла.

Символ . экранируется \. так, что он интерпретируется sed как буквальный . символ, а не как регулярное выражение . (что означает совпадение с любым символом). $ Является якорным концом-линии, так что не соответствует .jpg в середине файла.

Я думаю, что ОП хочет удалить любое расширение, но, вероятно, только «последнее». Так что, возможно, измените свой хороший ответ с помощью: sed 's/\.[^.]*$//' да, это регулярное выражение сработало бы в этом случае . но если ОП хочет этого, они должны сказать об этом, вместо того, чтобы прямо сказать, что они "хотят, чтобы оно было внесено в список без .jpg" @jlliagre Я согласен с cas, что -1 следует указать. Это только по умолчанию, когда труба включена, что является скрытым сюрпризом для некоторых. Таким образом, сделать это явно помогает пониманию. Я также делаю это в своих сценариях, чтобы знать, какой вывод я ожидаю. Предупреждение В случае имени файла с ключом ( .jpg ) перед символом новой строки вы удалите даже это, .jpg а не только последнее. Лучше избегать передачи и разбора вывода ls, он часто оставляет за собой хорошо скрытые сюрпризы . (несколько слов и ссылок больше в ответе).

Если вы просто хотите использовать bash:

Вы должны тянуться grep при попытке найти совпадения, а не об удалении / замене того, что sed более уместно:

Как только вы решите, что вам нужно создать несколько подкаталогов для наведения порядка в ваших файлах PNG, вы можете легко изменить это на:

find Конвейер в sed раствор может представить некоторые проблемы , если вы нашли файл с ключом ( .jpg ) как часть имени и непосредственно перед символом новой строки. Лучше избегать передачи и анализа выходных данных find или ls , это часто оставляет скрытые сюрпризы . (некоторые слова и ссылки больше в ответе). Вероятно, заменить find на что-то, как echo в последнем примере. Непонятно, для каких целей они find служат, и результаты зависят от структуры каталогов (то есть, если у вас есть каталог files.jpg )

Я бы пошел basename (при условии реализации GNU):

Обратите внимание, что если вы хотите использовать его в конвейере, может оказаться полезным использовать опцию базового имени -z (или --zero ) GNU для создания вывода, разделенного NUL (вместо символа новой строки).

Другой очень похожий ответ (я удивлен, что этот конкретный вариант еще не появился):

  • Вам не нужна эта -1 опция ls , поскольку ls предполагается, что если стандартный вывод не является терминалом (в данном случае это канал).
  • -n вариант sed означает «не печатать строку по умолчанию»
  • /p вариант в конце замещения означает '. и распечатать эту строку , если замена была сделана.

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

sed -n Метод часто оказывается полезным в тех случаях , когда вы могли бы использовать Grep + СЭД.

Мне нравится, как вы заботились, чтобы написать свой ответ. Это решение будет представлять проблемы с именами файлов, включая переводы строк , и не будет печатать первую часть имени. Еще больше, если он будет более неприятным с key ( .jpg ) перед символом перевода строки: в этом случае вы напечатаете эту часть без png, не стирая только последнюю часть. Часто предлагается избегать анализа (и передачи) результатов, ls потому что проблемы могут быть скрыты именно там, где вы не думаете . В принципе, я согласен с юзабилити, но этот вариант не работает, если у вас есть имя файла с каждой новой строкой внутри. Это может легко произойти незамеченным, например, когда вы копируете и вставляете строку из pdf в GUI, так что вы думаете, что следует избегать только патологических имен файлов . Более того ИМХО С парсинга легко начать разбираться ls , но это грядущие проблемы. Часто мы создаем сценарии, которые будем использовать позже, когда мы уже забудем их предел . (это человек, это обычно). Я предложил в find пример (с -exec и без трубы) , даже если я считаю лучший вариант (потому что чистая раковина) ответить на один cuonglm в твердый и POSIX - совместимым. @Hastur: эти будущие проблемы возникнут в любом случае. Многие вещи в системе не устойчивы к файлам с символами новой строки. Например, попробуйте использовать locate или make на них.

Для этого вы можете использовать только команды BASH (без каких-либо внешних инструментов).

Это полезно, когда у вас нет / usr / bin и хорошо работает с именами файлов, такими как this.is.image.jpg, и со всеми расширениями.

Не безопасно разбирать ls или передавать по трубам find [ 1 , 2 ]

Не безопасно анализировать (и передавать) выходные данные ls или find , главным образом потому, что в именах файлов можно найти необычные символы, такие как символ новой строки , вкладка . Здесь будет работать чистый цикл оболочки [ cuonglm ] .
Даже find команда, не включенная в опцию, -exec будет работать:

Обновления / Заметки : Вы можете использовать, find . чтобы искать даже скрытые файлы или find ./*.jpg получать только не скрытые. С ним find *.jpg -exec . могут возникнуть проблемы, если в нем присутствовал файл с именем, .jpg потому что find получит его в качестве опции. Вы можете добавить, -maxdepth 0 чтобы избежать спуска в каталогах, названных как Dir_01.jpg , или find ./*.jpg -prune -exec . когда maxdepth не разрешен (спасибо Стефану). Если вы хотите избежать перечисления этих каталогов, вы должны добавить опцию -type f (которая также исключает другие типы нестандартных файлов). Посмотрите man на более полную панораму обо всех доступных опциях, и не забудьте проверить, когда они совместимы с POSIX, для лучшей переносимости.

Еще несколько слов

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

Если вы хотите проверить, вы можете создать имена файлов, как это с помощью команд

Простое /bin/ls *png будет выводить ? вместо непечатных символов

Во всех случаях , в которых вы будете трубы на выходе из ls или find следующая команда не будет иметь никакого намека , чтобы понять , если нынешняя линия исходит от нового имени файла или если он следует символ новой строки символ в Прецедент имени файла . Противное имя действительно, но до сих пор правовые один.

Цикл оболочки с параметром-расширением оболочки $ , в обоих вариантах с printf или echo будет работать [ cuonglm ], [ Anthon1 ] .

Со страницы руководства по расширению параметров оболочки [ 3 ]

$
$

. результатом раскрытия является значение параметра с удаленным самым коротким шаблоном соответствия (регистр '%') или самым длинным шаблоном соответствия (регистр '%%').

If I have simply missed where this is documented, please let me know where I should have looked, and close this out.

Many places describe how custom filename suffixes interact with the toolchain: _test , _linux , _arm . However I cannot find anywhere that says you should use snake case for multi-word file names, as is suggested by the standard library: e.g. time/zoneinfo_read.go / os/removeall_at.go not time/zoneinfoRead.go / os/removeallAt.go or time/zoneinfo-read.go / os/removeall-at.go .

This may seem self evident to experienced users, but I have seen many people get confused by the fact that variables use CamelCase := "" , while files use snake_case.go .

The text was updated successfully, but these errors were encountered:

The Go project itself tends to prefer short names like io.go , pipe.go , etc. In the rare cases two words are needed, they are joined without an underscore, like cputicks.go or debugcall.go . For more complicated packages with many files, underscores are sometimes used when additional separation is needed.

That is useful to note. It led me down a bit of a rabbit hole, and it looks like even the standard library is not consistent (though lowercasealloneword seems to be in the plurality). Should we make a standard?

file.extension.go

snake_case.go

lowercase.go

CamelCase.go

ianlancetaylor commented Dec 10, 2019

Although the compiler made a different choice, for the standard library we've historically preferred all lowercase just to avoid confusion on case-insensitive systems. I don't know that this is written down anywhere. I don't know that we have any particular guidance for file names in packages outside the standard library.

I don't know that we have any particular guidance for file names in packages outside the standard library.

At this time, I'm inclined to believe we should not.

People who care about this can look at the .go file naming strategies used by the Go standard library and mimic it. Those who don't care can choose a naming strategy that they prefer.

carnott-snap commented Dec 17, 2019

I opened this issue because I have colleagues that asked, what filename conventions should I use with go?

I can understand that trying to stabilise this now may be problematic, noisy, or too late. But the lack of consensus will cause some amount of confusion and cognitive overhead. Because the community (seems to) understand the benefits of standardisation, see gofmt , even a soft recommendation in a blog post would go a long way.

Настройка среды разработки GoLang в коде Visual Studio

Visual Studio Code - мой любимый инструмент разработки. Итак, если вы можете настроить среду разработки GoLang на Visual Studio Code для разработки программ GoLang, это, несомненно, очень интересно. Эта статья посвящена этому процессу.

1. Установка GoLang

Установка GoLang на Windows относительно проста, и этот процесс пропущен.

Следует отметить, что при установке GoLang необходимо убедиться, что две переменные среды, одна из которых является переменной среды GOROOT, а вторая - переменная среды PATH, должны содержать значение $ GOROOT \ bin.

2. Введение в плагин GoLang

Особенности этого плагина включают в себя:

  • Цветной код
  • Завершение кода (используя gocode)
  • сегмент кода
  • Быстрая подсказка (используйте godef)
  • Перейти к определению (используйте godef)
  • Поиск ссылок (используя go-find-reference)
  • Схема документа (с использованием плана)
  • Переименовать (использовать gorename)
  • Сохранить сборку (используя go build и go test)
  • Форматирование кода (используя goreturns или goimports или gofmt)
  • Отладочный код (с использованием delve)

Три, плагин установки

1. Установите код Visual Studio версии 0.10.2.

2. Установите плагин

Войдите в интерфейс кода Visual Studio, используйте сочетание клавиш Ctrrl + Shift + p, откройте командную панель, выберите «Расширения: установить расширение» и дождитесь загрузки списка имен плагинов (этот шаг медленнее в Китае).
Затем введите go в поле ввода "ext install", выберите go 0.6.15, нажмите "установить", после завершения установки требуется перезапустить среду разработки, нажмите кнопку "Перезагрузить", чтобы автоматически обновить среду.

3. Установите переменную среды GOPATH

Установите переменную среды GOPATH в системе Windows, мое значение D: \ tools \ VSCode \ works
Отсутствующие переменные среды GOPATH обычно сообщают об ошибках типа «$ GOPATH not set».

4. Включите автосохранение

Настоятельно рекомендуется включить функцию автосохранения. Способ открытия: выберите меню «Файл» и нажмите «Автосохранение».

5. Установите Git

Процесс установки Git на Windows опущен. Не забудьте настроить git \ bin в переменную окружения PATH.

В-четвертых, настройте плагин

Параметры конфигурации Visual Studio Code поддерживают параметры подключаемого модуля GoLang, которые можно настроить с помощью параметров пользовательских настроек или параметров рабочей области. Его можно найти в меню Файл-> Настройки.

1. Нажмите Настройки пользователя

Если переменная среды GOPATH не установлена, то она должна быть установлена ​​здесь.

2. Выполнять команды

1) Установить гокод

2) Установите godef

3) Установить голинт

4) Установить Go-Find-ссылки

5) Установить Go-контур

6) Установить гортани

7) Установить имя

3. Используйте


После завершения вышесказанного очень удобно начинать разработку GoLang. как показано на рисунке:

Интеллектуальная рекомендация


Краткое описание общих функций MPI

содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.

Примечание 9: EL выражение


JVM память

концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.

Проблема сетевого запроса на Android 9.0

вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.


Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.

предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.

Пакет Go состоит из Go-файлов, расположенных в одной и той же директории, в начале которых имеется одинаковое выражение package . Пакеты, подключаемые к программам, позволяют расширять их возможности. Некоторые пакеты входят в состав стандартной библиотеки Go. А это значит, что они, если вы пользуетесь Go, уже у вас установлены. Другие пакеты устанавливают с помощью команды go get . Можно, кроме того, писать собственные Go-пакеты, создавая файлы в особых директориях, и придерживаясь правил оформления пакетов.


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

Предварительные требования

  • Настройте программное окружение Go (о том, как это сделать, можно узнать здесь). Создайте рабочее пространство Go (этому посвящён пятый пункт вышеупомянутого материала). В следующем разделе этого материала вы сможете найти примеры, которые рекомендуется воспроизвести у себя. Так вы сможете лучше с ними разобраться.
  • Для того чтобы углубить свои знания по GOPATH — взгляните на этот материал.

Написание и импорт пакетов

Написание кода пакета — это то же самое, что и написание обычного кода на Go. Пакеты могут содержать объявления функций, типов и переменных, которые потом могут быть использованы в других Go-программах.

Прежде чем мы сможем приступить к созданию нового пакета, нам нужно перейти в рабочее пространство Go. Оно находится по пути, задаваемом переменной GOPATH . Например, пусть наша организация называется gopherguides . При этом мы, в качестве репозитория, используем GitHub . Это приводит к тому, что у нас, по пути, задаваемом GOPATH , имеется следующая структура папок:


Мы собираемся назвать пакет, который будем разрабатывать в этом руководстве, greet . Для того чтобы это сделать — создадим директорию greet в директории gopherguides . В результате имеющаяся структура папок приобретёт следующий вид:


Теперь мы готовы к тому, чтобы добавить в директорию greet первый файл. Обычно файл, который является входной точкой (entry point) пакета, называют так же, как названа директория пакета. В данном случае это означает, что мы, в директории greet , создаём файл greet.go :


В этом файле мы можем писать код, который хотим многократно использовать в наших проектах. В данном случае мы создадим функцию Hello , которая выводит текст Hello, World! .

Откройте файл greet.go в текстовом редакторе и добавьте в него следующий код:


Разберём содержимое этого файла. Первая строка каждого файла должна содержать имя пакета, в котором мы работаем. Так как мы находимся в пакете greet — здесь используется ключевое слово package , за которым следует имя пакета:


Это сообщает компилятору о том, что он должен воспринимать всё, что находится в файле, как часть пакета greet .

Далее выполняется импорт необходимых пакетов с помощью выражения import . В данном случае нам нужен всего один пакет — fmt :


И, наконец, мы создаём функцию Hello . Она будет использовать возможности пакета fmt для вывода на экран строки Hello, World! :


Теперь, после того, как создан пакет greet , вы можете воспользоваться им в любом другом пакете. Создадим новый пакет, в котором воспользуемся пакетом greet .

А именно, мы создадим пакет example . Для этого будем исходить из тех же предположений, из которых исходили, создавая пакет greet . Для начала создадим папку example в папке gopherguides :


Теперь создаём файл, являющийся входной точкой пакета. Данный пакет мы рассматриваем как выполняемую программу, а не как пакет, код которого планируется использовать в других пакетах. Файлы, являющиеся входными точками программ, принято называть main.go :


Откройте в редакторе файл main.go и внесите в него следующий код, который позволяет воспользоваться возможностями пакета greet :


Мы импортировали в файле main.go пакет greet , а это значит, что для вызова функции, объявленной в этом пакете, нам понадобится воспользоваться точечной нотацией. Точечная нотация — это конструкция, в которой между именем пакета и именем ресурса этого пакета, который нужно использовать, ставится точка. Например, в пакете greet роль ресурса играет функция Hello . Если нужно вызвать эту функцию — используется точечная нотация : greet.Hello() .

Теперь можно открыть терминал и запустить программу:


После того, как вы это сделаете, в терминале будет выведено следующее:


Теперь поговорим о том, как использовать переменные, объявляемые в пакетах. Для этого добавим объявление переменной в файл greet.go :


Откройте файл main.go и добавьте в него строку, в которой функция fmt.Println() используется для вывода значения переменной Shark , объявленной в пакете greet.go . А именно, приведите main.go к следующему виду:


Снова запустите программу:


Теперь она выведет следующее:


А сейчас поговорим о том, как объявлять в пакетах типы. Создадим тип Octopus с полями Name и Color , а также создадим метод типа. Этот метод, при его вызове, будет возвращать особым образом обработанное содержимое полей типа Octopus . Приведём greet.go к следующему виду:


Теперь откройте main.go , создайте в нём экземпляр структуры нового типа и обратитесь к его методу String() :


После того, как вы, с помощью конструкции, которая выглядит как oct := greet.Octopus , создали экземпляр Octopus , вы можете обращаться к методам и свойствам типа из пространства имён файла main.go . Это, в частности, позволяет воспользоваться командой oct.String() , расположенной в конце файла main.go , не обращаясь к greet . Кроме того, мы можем, например, обратиться к полю структуры Color , воспользовавшись конструкцией oct.Color . При этом мы, как и тогда, когда вызывали метод, не обращаемся к greet .

Метод String типа Octopus использует функцию fmt.Sprintf для формирования предложения и возвращает, с помощью return , результат, строку, в место вызова метода (в данном случае это место находится в main.go ).

Запустим программу снова:


Она выведет в консоль следующее:


Теперь, когда мы оснастили Octopus методом String , мы получили механизм вывода сведений о типе, подходящий для многократного использования. Если в будущем понадобится изменить поведение этого метода, который может использоваться во многих проектах, достаточно будет один раз отредактировать его код в greet.go .

Экспорт сущностей

Возможно, вы обратили внимание на то, что всё, с чем мы работали, обращаясь к пакету greet , имеет имена, начинающиеся с прописной буквы. В Go нет модификаторов доступа наподобие public , private или protected , которые есть в других языках. Видимость сущностей для внешних механизмов контролируется тем, с какой буквы, с маленькой или с большой, начинаются их имена. В результате типы, переменные, функции, имена которых начинаются с прописной буквы, доступны за пределами текущего пакета. Код, который виден за пределами пакета, называется экспортированным.

Если оснастить тип Octopus новым методом с именем reset , то этот метод можно будет вызывать из пакета greet , но не из файла main.go , который находится за пределами пакета greet . Вот обновлённый вариант greet.go :


Попытаемся вызвать reset из файла main.go :


Это приведёт к появлению следующей ошибки компиляции:


Для того чтобы экспортировать метод reset типа Octopus нужно его переименовать, заменив первую букву, строчную r , на прописную R . Сделаем это, отредактировав greet.go :


Вот что попадёт в консоль:


Вызвав метод Reset , мы очистили поля Name и Color нашего экземпляра Octopus . В результате, при вызове String , там, где раньше выводилось содержимое полей Name и Color , теперь не выводится ничего.

Итоги

Написание пакетов Go ничем не отличается от написания обычного Go-кода. Однако размещение кода пакетов в собственных директориях позволяет изолировать код, которым можно воспользоваться в любых других Go-проектах. Здесь мы поговорили о том, как объявлять в пакетах функции, переменные и типы, рассмотрели порядок использования этих сущностей за пределами пакетов, разобрались с тем, где нужно хранить пакеты, рассчитанные на их многократное использование.

Читайте также: