Некоторые из них могут нуждаться в адаптации в зависимости от того, есть ли у вас папки и что вы хотите с ними делать.
Кевин
1
Не должно *.!(txt)быть !(*.txt)?
Лри
@LauriRanta зависит от того, что находится в папке, на которую мы не получили ответа. Это нормально, как если бы все файлы имели расширения, и rmзадохнулся бы, если бы были папки.
Кевин
У меня проблема с скобками. Когда я использую стиль globbing в скрипте bash, он жалуется на синтаксическую ошибку и круглые скобки. Однако делать это из CLI работает.
CMCDragonkai
1
@izogfif проверьте, что это find . -type f ! -name "*.txt" | xargs -r rmбудет работать в GNU \ xargs. Команда BSD и UNIX xargs может не иметь -r, вы должны проверить свой локальныйman xargs
Ntwobike
10
Есть много способов сделать это. но самый простой способ был бы (bash):
ls | grep -v *.txt | xargs rmработает так же хорошо
Филлипск
@phillipsk grep -v *.txtбудет работать, только если есть только один .txtфайл. Если его нет, grepбудет использоваться *.txtв качестве шаблона; если их больше одного, он будет искать первое имя файла во всех остальных .txtфайлах, игнорируя вывод из ls. (Точные результаты могут зависеть от параметров оболочки.)
JigglyNaga
.txt$будет соответствовать строки, заканчивающиеся txtнезависимо от точки. Потому что grepпринимает в качестве параметра регулярное выражение. Так что файлы a.txtи aatxtи a-txtвсе будут совпадать с этим выражением. Правильное выражение должно быть ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Для любопытных: если вы хотите поэкспериментировать с выражением, смело используйте это тестовое выражение ls | grep \\.txt$ | xargs --no-run-if-empty echo(примечание: там нет -vфлага и rm=>echo). Примечание 2: вы могли заметить двойную обратную косую черту. Один для регулярных выражений, другой для bash, чтобы избежать косой черты.
Димитрий К
1
Просто сделайте:
rm $(ls -I "*.txt" )# Удаляет тип файла, кроме * .txt
Аналогичным образом, если необходимо удалить «кроме одного или нескольких типов файлов», выполните:
Добро пожаловать в StackExchange! -IВариант может быть полезен, но видеть , почему не разобрать Ls . И чего | xargsдостигать? Без каких-либо аргументов, он просто работает echoна всех своих входных данных.
JigglyNaga
Чего xargsпредполагается достичь?
дхаг
Спасибо, xargs не был полезен в вышеупомянутом случае, исправили сейчас.
Сурия
0
Это также работает для удаления всех скрытых (точечных) файлов и папок, кроме указанного ( .mydir):
ls
перед тем, как пытаться позвонитьrm
.Ответы:
Вы можете использовать
find
:Или расширенные возможности bash:
Или в зш:
источник
*.!(txt)
быть!(*.txt)
?rm
задохнулся бы, если бы были папки.find . -type f ! -name "*.txt" | xargs -r rm
будет работать в GNU \ xargs. Команда BSD и UNIX xargs может не иметь -r, вы должны проверить свой локальныйman xargs
Есть много способов сделать это. но самый простой способ был бы (bash):
источник
Если вы просто хотите удалить все файлы, кроме «* .txt», вы можете использовать следующую команду:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
но если вы также хотите удалить каталоги вместе с файлами, вы можете использовать это:
$ find . ! -name "*.txt" -exec rm -r {} \;
источник
Одно решение без
find
:Это должно работать на всех видах снарядов.
источник
Вы можете использовать перевернутый grep и xargs
источник
ls | grep -v *.txt | xargs rm
работает так же хорошоgrep -v *.txt
будет работать, только если есть только один.txt
файл. Если его нет,grep
будет использоваться*.txt
в качестве шаблона; если их больше одного, он будет искать первое имя файла во всех остальных.txt
файлах, игнорируя вывод изls
. (Точные результаты могут зависеть от параметров оболочки.).txt$
будет соответствовать строки, заканчивающиесяtxt
независимо от точки. Потому чтоgrep
принимает в качестве параметра регулярное выражение. Так что файлыa.txt
иaatxt
иa-txt
все будут совпадать с этим выражением. Правильное выражение должно бытьls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Для любопытных: если вы хотите поэкспериментировать с выражением, смело используйте это тестовое выражениеls | grep \\.txt$ | xargs --no-run-if-empty echo
(примечание: там нет-v
флага иrm=>echo
). Примечание 2: вы могли заметить двойную обратную косую черту. Один для регулярных выражений, другой для bash, чтобы избежать косой черты.Просто сделайте:
rm $(ls -I "*.txt" )
# Удаляет тип файла, кроме * .txtАналогичным образом, если необходимо удалить «кроме одного или нескольких типов файлов», выполните:
rm $(ls -I "*.txt" -I "*.pdf" )
# Удаляет типы файлов, кроме * .txt & * .pdfисточник
-I
Вариант может быть полезен, но видеть , почему не разобрать Ls . И чего| xargs
достигать? Без каких-либо аргументов, он просто работаетecho
на всех своих входных данных.xargs
предполагается достичь?Это также работает для удаления всех скрытых (точечных) файлов и папок, кроме указанного (
.mydir
):источник