Удаление списков, который фильтрован при создании вывода

У меня есть каталог с набором смешанных расширений файлов, и я хотел бы перечислить определенное расширение файла (возможно, что-то как grep *.mp3) и при списке, удалите их с выводом. Как я могу сделать это или если существует простофиля, не стесняйтесь отмечать меня на.

Пример:

grep "*.mp3" . | rm -fr 
5
задан 23 September 2016 в 22:40

3 ответа

Давайте запустимся с каталога с три mp3 файлы:

$ ls *mp3
a.mp3  b.mp3  c.mp3

Теперь, давайте удалим их после того, как мы перечисляем то, что мы удаляем:

$ find . -maxdepth 1 -name '*.mp3' -printf 'Deleting %p\n' -delete
Deleting ./a.mp3
Deleting ./b.mp3
Deleting ./c.mp3

После того, как это сделано, mp3 файлов не стало:

$ ls *mp3
ls: cannot access '*mp3': No such file or directory

Как это работает

  • 'найдите.

    Это запускает a find команда. Это будет искать файлы в текущем каталоге, ..

  • -maxdepth 1

    По умолчанию, find рекурсивно подкаталоги поисков. Это говорит этому не делать это. С -maxdepth 1, команда find только посмотрит на то, что это находит в текущем каталоге, и не исследуют любой из подкаталогов текущего каталога.

  • -name '*.mp3'

    Это говорит, находят, чтобы только искать файлы с .mp3 расширение.

  • -printf 'Deleting %p\n'

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

    Можно, конечно, изменить это на другое сообщение, если Вам нравится. Если Вы не хотите сообщение, то эта опция может быть опущена полностью.

  • -delete

    Это говорит, находят для удаления каждого файла.

Поиск без учета регистра

Если Вы также хотите найти файлы названными .MP3 или .Mp3 и т.д. затем нам нужен поиск без учета регистра, и мы используем -iname:

find . -maxdepth 1 -iname '*.mp3' -printf 'Deleting %p\n' -delete
5
ответ дан 23 November 2019 в 08:46

Вы хотите find...

find . -type f -iname "*.mp3"

По умолчанию это рекурсивно вызовет к подкаталогам, поэтому если Вы получите больше файлов, чем Вы хотите, добавьте -maxdepth 1 для поиска в текущем каталоге только. После проверки, что вывод - то, что Вы хотите удалить, можно сделать это снова (спасибо стрелка вниз...) и добавить -delete.

find . -type f -iname "*.mp3" -delete

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

Для создания этого интерактивным Вы могли использовать -exec для определения собственного действия вместо find -delete действие

find . -type f -iname "*.mp3" -exec rm -i -- {} \;

Затем, это предложит Вам прежде, чем удалить каждый файл...

4
ответ дан 23 November 2019 в 08:46

Когда Вы хотите удалить только объекты в текущем каталоге, достаточно использовать подстановочный знак как так:

$ ls *.jpeg
birthday2016_001.jpeg  birthday2016_002.jpeg  birthday2016_003.jpeg
$ rm *.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory

, Как Вы видите, в примере выше, все файлы с .jpeg, расширение было удалено. Список их, та же идея - echo *.jpeg и ls *.jpeg. Таким образом, Вы по существу могли сделать просто ls *.mp3 && rm *.mp3 для Вашего случая

альтернатива Python:

В моем случае, я удалял .jpeg файл, поэтому скорректируйте код ниже по мере необходимости:

 python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".")  if i.endswith(".jpeg")]'

выполненный Образец:

$ ls *.jpeg
birthday2016_001.jpeg  birthday2016_002.jpeg  birthday2016_003.jpeg     
$ python -c 'import os,sys;[(sys.stdout.write(i + "\n"),os.unlink(i)) for i in os.listdir(".")  if i.endswith(".jpeg")]'
birthday2016_003.jpeg
birthday2016_001.jpeg
birthday2016_002.jpeg
$ ls *.jpeg
ls: cannot access '*.jpeg': No such file or directory
3
ответ дан 23 November 2019 в 08:46

Другие вопросы по тегам:

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