У меня есть каталог с набором смешанных расширений файлов, и я хотел бы перечислить определенное расширение файла (возможно, что-то как grep *.mp3
) и при списке, удалите их с выводом. Как я могу сделать это или если существует простофиля, не стесняйтесь отмечать меня на.
Пример:
grep "*.mp3" . | rm -fr
Давайте запустимся с каталога с три 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
Вы хотите 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 -- {} \;
Затем, это предложит Вам прежде, чем удалить каждый файл...
Когда Вы хотите удалить только объекты в текущем каталоге, достаточно использовать подстановочный знак как так:
$ 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
для Вашего случая
В моем случае, я удалял .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