
ls -1
перечисляет мои элементы следующим образом:
foo.png
bar.png
foobar.png
...
Я хочу, чтобы это было указано без .png
подобных вещей:
foo
bar
foobar
...
(каталог содержит только .png
файлы)
Может кто-нибудь подскажет, как пользоваться grep
в этом случае?
Цель: У меня есть текстовый файл, в котором все имена перечислены без расширения. Я хочу создать скрипт, который сравнивает текстовый файл с папкой, чтобы увидеть, какой файл отсутствует.
решение1
ls -1 | sed -e 's/\.png$//'
Команда sed
удаляет (то есть заменяет пустой строкой) любую строку, .png
найденную вконецимени файла.
The .
экранируется как \.
, так что он интерпретируется sed
как буквальный .
символ, а не как регулярное выражение .
(что означает соответствие любому символу). The $
— это якорь конца строки, поэтому он не соответствует .png
середине имени файла.
решение2
Для этой работы вам понадобится только оболочка.
POSIXly:
for f in *.png; do
printf '%s\n' "${f%.png}"
done
С zsh
:
print -rl -- *.png(:r)
решение3
Если вы просто хотите использовать bash:
for i in *; do echo "${i%.png}"; done
grep
При поиске совпадений следует использовать не удаление/замену, а sed
следующее:
find . -maxdepth 1 -name "*.png" | sed 's/\.png$//'
Как только вы решите, что вам нужно создать несколько подкаталогов, чтобы навести порядок в ваших PNG-файлах, вы можете легко изменить это следующим образом:
find . -name "*.png" | sed 's/\.png$//'
решение4
Еще один очень похожий ответ (удивительно, что этот конкретный вариант еще не появился):
ls | sed -n 's/\.png$//p'
- Вам не нужна опция
-1
,ls
так какls
предполагается, что стандартный вывод не является терминалом (в данном случае это канал). - опция
-n
означаетsed
«не печатать строку по умолчанию» - опция
/p
в конце подстановки означает «...и вывести эту строку, если была сделана подстановка».
Чистый эффект этого заключается в том, чтобы распечатать только те строки, которые заканчиваются на .png
, с .png
удаленным. То есть, это также удовлетворяет небольшому обобщению вопроса OP, где каталог содержит не только .png
файлы.
Этот sed -n
метод часто полезен в случаях, когда в противном случае вы могли бы использовать grep+sed.