Если я устанавливаю текущий/рабочий каталог (переходя в него с помощью cd
) на какой-то определенный каталог, а затем ввожу:
rm *.xvg
Что сделает эта команда? Правда ли, что указанная выше команда сделаеттолькоудалить файлы с расширением.xvg
тольков рабочем каталоге?
Я волновался, прежде чем попробовать это, потому что я хотел быть абсолютно уверен, что указанная выше команда удалит только .xvg
файлы.РАСПОЛОЖЕНО В РАБОЧЕМ КАТАЛОГЕ.
решение1
Да, rm *.xvg
будеттолькоудалите файлы с указанным расширением в вашемтекущийкаталог.
АхорошийЧтобы убедиться, что вы действительно находитесь в каталоге, из которого хотите удалить файлы, можно воспользоваться командой pwd
, которая отобразит ваш текущий каталог, а затем выполнить команду , ls
чтобы убедиться, что вы нашли нужные файлы.
Если вы немного опасаетесь отдавать команду rm
, есть 2 вещи, которые вы можете сделать:
введите
ls *.xvg
, чтобы увидеть список файлов, на которые будет влиять эта команда.Если у вас нетмногофайлов, вы всегда можете использовать
-i
переключатель командной строки дляrm
(также существует дляcp
иmv
). Использованиеrm -i *.xvg
будет спрашивать вас для каждого отдельного файла, можно ли его удалить, так что вы можете быть уверены, что ничего неожиданного не будет удалено. (Хотя это будет утомительно, если у вас много файлов :)
решение2
Вам не нужно переходить в каталог, просто используйте
rm /some/dir/*.xvg
В случае, если у вас опечатка или подобная ошибка в пути, где /som/dir не существует:
cd /som/dir
rm *.xvg
случайно удалит все .xvg-файлы в текущем каталоге. Первая команда этого не сделает, и вам не нужно будет возвращаться обратно.
Альтернативным способом было бы использование find:
find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete
решение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здесь. Одним из наиболее распространенных расширений является *
, которое расширяется до имен файлов в текущем каталоге.
Простой способ взглянуть на работу globs — использовать echo
, который выводит все аргументы, переданные ему через оболочку. Так что ввод echo *
в том же каталоге выведет foo.bar
. Так что когда вы вводите rm *.bar
, на самом деле происходит следующее: оболочка расширяет список аргументов до foo.bar
, а затем передает его команде rm
.
Есть несколько способов управления подстановкой. Например, в последних версиях bash можно включить опцию globstar, которая будет выполнять рекурсивное расширение. Ввод echo **/*.bar
покажет список всех файлов, заканчивающихся на , .bar
во всех подпапках. Так что ввод rm **/*.bar
globstar enabled bash действительно рекурсивно удалит все соответствующие файлы в подпапках.
решение4
Команда:
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)