Я хотел удалить какой-то пакет в моем домашнем файле, но имя файла было слишком длинным ( google-chrome-stable_current_i386.deb
). Итак, я решил использовать команду ls|grep chrome|rm
для передачи файлов в grep, чтобы отфильтровать файл chrome, а затем удалить его. Это не сработало, поэтому я хотел бы посмотреть, как я могу это сделать.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
черезgrep
к ,rm
но не мог заставить его работать. Таким образом, вы получите один или два хороших ответа о «правильном» или «простом» способе выполнения вашей задачи, вместо того, чтобы заставлять кого-то дать вам хороший ответ о неэффективном решении.Ответы:
Это почти заставило меня вздрогнуть.
ls
собирается быть более сложным и подверженные ошибкам , чем установленные методы , какfind [...] -exec
и комки .rm google
и нажмите Tab. Если он не завершится немедленно, нажмите еще Tabраз, чтобы увидеть список подходящих файлов. Введите больше символов имени файла, чтобы сузить его, пока оно не завершится, затем выполните команду.источник
rm
- это, вероятно, самый распространенный способ поджарить ваш дистрибутив.Вы также можете использовать команду find с подстановочным знаком:
Обратите внимание, что аргумент "-maxdepth" гарантирует, что поиск работает только в текущем каталоге и не переходит в подкаталоги.
источник
-iname
для имен файлов без учета регистра (б) путь кxargs
использованию-print0
флага дляfind
и-0
флага дляxargs
. Использованиеxargs
позволяет делать такие вещи, как «интерактивное» (подтвердить удалениеfoo
?) Удаление .find . -name '*chrome*' -exec rm -i {} +
maxdepth
1.Вы правильно поняли, просто пропустили некоторые детали. Поскольку вы имеете дело со списком, поступающим в STDIN и
rm
ожидающим параметры, вам необходимо использоватьxargs
.Таким образом:
Должен дать вам то, что вы хотите.
Обратите внимание, что если вы хотите удалить все, кроме
chrome
файла, вы можете просто добавить-v
кgrep
заявлению.Обратите внимание, что, согласно другим ответам на этот вопрос, это, вероятно, плохой способ выполнить то, что вы хотите достичь.
источник
-v
, не будет ли это удалить все, кроме файлов, которые соответствуютchrome
? Я не думаю, что это то, что хочет ОП ...ls
выводе нет «странных» имен файлов . Имена файлов с пробелами разрушат это. Это также опасно, если кто-то может создать имя файла со специальным соусом в каталоге, где вы его запускаете. Как уже указали несколько человек, не анализируйте вывод ls !Никогда не анализируйте выходные данные ls.
Я предлагаю избегать синтаксического анализа выходных данных ls [ 1 ] , даже больше, если это связано с
del
командой. Это по многим причинам в основном связано с неожиданными и не обычными символами, разрешенными в имени файла.Даже если вы ожидаете, что имена файлов, относящиеся к пакетам Linux, будут «вести себя хорошо» , эта проблема, тем не менее, может появиться, если в этом же каталоге присутствуют другие файлы, но вы не знали или не заметили.
Лучше использовать
find
расширение вкладки (начните писать имя и нажмите Tab), расширение имени файла [ 2 ] как*MyKey*
...Быстрое решение
Поскольку вы хотите выбрать все пакеты (которые заканчиваются
.deb
) с помощью "google" внутри, вы можете создать свой запрос с помощью подстановочного знака*
*google*.deb
и сделать простойэто выберет каждое имя файла с "google" в середине, которое будет отображаться
.deb
в текущем каталоге. Опция-i
(интерактивная) запросит подтверждение, что является хорошей привычкой при удалении файлов с расширением параметра.Решение, близкое к философии вашей попытки.
Если ваша цель состоит в том, чтобы строить фрагмент командной строки за фрагментом, то есть вы сделали это
ls
послеls | grep google
, и только после проверки выходных данных, вы можете выполнить их в подоболочке$(...)
с помощьюБолее быстрый и опасный способ [ 3 ] заключается в использовании
!!
это выполнит последнюю команду, законченную в вашей истории . Вы можете защитить себя от того факта, что у вас нет визуального контроля над строкой, которую вы собираетесь выполнить, если вы заранее включили параметры оболочки
histverify
с помощьюshopt -s histverify
.источник
... используйте
-name '*c*.deb'
или какой-либо другой шаблон, который вам подходит.источник
rm
не принимает входные данные отstdin
. Вам нужно будет сделать что-то вродеls google-chrome* | xargs rm
источник