Как я могу удалить все файлы с определенным расширением в определенной папке?

36

Если я установлю текущий / рабочий каталог (перейдя к нему с помощью cd) в какой-то конкретный каталог, а затем введите:

rm *.xvg

Что будет делать эта команда? Правда ли, что приведенная выше команда удалит только файлы с расширением .xvg только в рабочем каталоге?

Я нервничал, пытаясь это сделать, прежде чем спрашивать, потому что я хочу быть абсолютно уверен, что приведенная выше команда удалит только .xvgфайлы, расположенные в рабочем каталоге .

Эндрю
источник

Ответы:

34

Да, rm *.xvgбудут удаляться только файлы с указанным расширением в вашем текущем каталоге.

Хороший способ убедиться , что вы действительно в директории , которую вы хотите удалить файлы, чтобы использовать pwdкоманду , которая будет отображать текущую директорию , а затем выполнить команду , lsчтобы подтвердить , что вы нашли файлы , которые вы ожидали.

Если вы немного опасаетесь ввода rmкоманды, вы можете сделать 2 вещи:

  1. введите, ls *.xvgчтобы увидеть список файлов, которые будут затронуты этой командой.

  2. Если у вас не много файлов, вы всегда можете также использовать -iпереключатель командной строки для rm(также существует для cpи mv). Использование rm -i *.xvgпредложит вам для каждого отдельного файла, если это нормально, чтобы удалить его, так что вы можете быть уверены, что ничего, что вы не ожидали, было удалено. (Это будет утомительно, если у вас много файлов, хотя :)

Левон
источник
1
Также: rm -f {*.xvg,.*.xvg}удалить также скрытые файлы. И rm -R -f {*.xvg,.*.xvg}убрать также каталоги.
Дор
20

Вам не нужно переходить в каталог, просто используйте

rm /some/dir/*.xvg 

В случае, если у вас есть опечатка или похожая ошибка в пути, где / som / dir не существует:

cd /som/dir
rm *.xvg

случайно удалит все .xvg-файлы в текущем каталоге. Первая команда не будет, и вам не нужно снова возвращаться.

Альтернативным способом было бы использовать find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 
неизвестный пользователь
источник
find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete работал для меня! используйте -maxdepth "n", чтобы удалить соответствующие файлы в подкаталоге, если указан путь
Vinay
3

Да, rm *.xvgудаляются только файлы, оканчивающиеся .xvgна текущий каталог. Вот почему

Когда вы набираете команду, подобную этой, работа распределяется между используемой оболочкой (предположим, bash) и двоичным файлом команды.

Вы можете найти двоичный файл, набрав which rm. Эта маленькая программа заботится о том, чтобы не связывать файлы. Такие программы могут быть запущены из командной строки и могут читать список аргументов prog arg1 arg2 arg3при запуске. В случае rm, они интерпретируются как список полностью определенных имен файлов, которые будут удалены. Так что, если вы находитесь в каталоге, содержащем файл foo.bar, ввод delete 'foo.*'приведет к rm: foo.*: No such file or directory. Обратите внимание на одинарные кавычки вокруг шаблона файла, они говорят оболочке передавать аргумент в оболочку как она есть.

Однако, если вы введете rm *.barв тот же каталог, файл будет удален. Здесь происходит то, что ваша оболочка, то есть программа, которую вы используете для ввода команд, выполняет некоторые преобразования перед передачей аргументов в команду. Один из них называется «расширение имени файла», иначе известный как «глобализация». Вы можете увидеть список расширений имени bash-файла здесь . Одним из наиболее распространенных расширений является *расширение имен файлов в текущем каталоге.

Простой способ взглянуть на глобусы в работе - использовать echo, который возвращает все аргументы, переданные ему через оболочку. Таким образом, ввод echo *в том же каталоге будет выводить foo.bar. Поэтому, когда вы печатаете rm *.bar, на самом деле происходит то, что оболочка расширяет список аргументов foo.bar, а затем передает это rmкоманде.

Есть несколько способов контроля за сгущением. Например, в последних версиях bash вы можете включить опцию globstar, которая будет выполнять рекурсивное расширение. При наборе echo **/*.barбудет показан список всех файлов, заканчивающихся .barво всех подпапках. Поэтому ввод rm **/*.barв globstar с включенным bash действительно рекурсивно удалит все соответствующие файлы в подпапках.

purzelrakete
источник
1

Команда:

  rm ./*.pgm

работает для меня

Команда:

rm *.pgm

выдает ошибку (на польском, переведено):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

в

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Адам
источник