Удаление файла в Linux
Обновлено: 21.11.2024
Вы хотите удалить или удалить каталог Linux/удалить файл Linux? Этот пост в блоге поможет вам сделать это и достичь ваших целей за минимальное время, необходимое для удаления файлов или удаления каталога Linux.
Список контента, который вы прочтете в этой статье:
Команда rm означает удаление, поэтому команда rm используется для удаления файлов и объектов каталогов из файловой системы, такой как UNIX, таких как папки, каталоги, символические соединения и т. д. Чтобы быть более конкретным, rm удаляет ссылки на объекты из файловая система, в которой такие объекты могут иметь несколько ссылок, например файл с двумя именами. Он не удаляет папки случайно.
Эта команда Linux обычно работает тихо, и вам следует соблюдать осторожность при ее использовании, потому что, если вы удалите файлы, вы не сможете восстановить содержимое определенных папок. Итак, в этом руководстве мы объясним все о том, как удалить каталог Linux и как удалить файлы в Linux/удалить каталог Linux и удалить файлы в Linux.
Использование команды RM/Как удалить файл и каталог в Linux [Linux Удалить каталог/Linux Удалить каталог]
Команда rm имеет следующий синтаксис:
rm [ВАРИАНТЫ]. ФАЙЛ.
когда мы используем команду rm с именем файла в качестве аргумента для удаления одного файла, ниже приведен синтаксис:
Вы получите сообщение об ошибке "Операция не разрешена", если у вас нет прав на запись в родительский каталог. Файл будет удален без предупреждения, если он не будет безопасно записан. Если инструкция выполнена успешно, она не производит вывода и возвращает пустое значение. Команда запросит разъяснения перед удалением файлов, защищенных от записи, как показано ниже:
rm: удалить защищенный от записи обычный пустой файл 'file'?
Введите y и нажмите Enter, чтобы удалить файл.
-f и параметр -v
Альтернатива -f указывает rm никогда не запрашивать пользователя и игнорировать любые файлы или аргументы, которых нет.
Используйте альтернативу -v (подробный), чтобы получить более подробную информацию об удаляемых элементах:
Это удалит файл "file1".
Как удалить несколько файлов?
Команда rm помогает вам удалить несколько файлов одновременно. Для этого используйте следующий синтаксис для передачи имен файлов в качестве аргументов, разделенных пробелом:
rm файл1 файл2 файл3
Регулярные выражения можно использовать для выравнивания разных файлов. Например, чтобы удалить все файлы .jpg в текущем каталоге, введите:
Обычно рекомендуется составить список файлов с помощью команды ls перед выполнением команды rm, используя регулярные выражения, чтобы увидеть, какие файлы можно удалить.
Как удалить каталоги Linux?
Использование альтернативы -d для удаления одного или нескольких пустых каталогов:
Команда rm -d аналогична команде rmdir с точки зрения функциональности.
Используйте -r (рекурсивный) вариант для рекурсивного удаления непустых папок и всех файлов в них:
rm -rf Команда
Команда rm попросит вас проверить процедуру, если указанный каталог или файл внутри него защищены от записи. Использование альтернативы -f для удаления каталога без запроса:
Команду rm -rf следует использовать с большой осторожностью, поскольку она очень опасна.
Команды Linux (rm/rmdir) имеют различные параметры, которые мы обсудим в этой статье.
При использовании этой команды вы должны понимать, что выполнение команд rm/rmdir не приведет к перемещению файлов и каталогов в корзину. Они будут немедленно удалены из вашей системы, и у вас не будет возможности восстановить их. Если вы случайно удалите файлы и каталоги, вы не сможете их восстановить. Поэтому перед безвозвратным удалением файлов обязательно создайте резервную копию.
Давайте разберемся с использованием команд rm/rmdir вместе с различными параметрами, доступными в операционной системе Linux.
Как удалить файлы Linux с помощью rm
<р>1. Одна из простых задач по удалению файла — из текущего рабочего каталога. Вам нужно только запустить команду rm вместе с именем файла, который вы хотите удалить. Вы можете рассмотреть приведенный ниже пример. <р>2. Если требуемый файл, который вы хотите удалить, отсутствует в текущем рабочем каталоге, вам необходимо ввести полный путь к этому имени файла, как показано ниже. <р>3. Кроме того, вы можете использовать команду rm для удаления нескольких файлов, которые вы можете указать после команды rm с пробелом между именами файлов, как показано ниже.rm имя_файла_2.txt имя_файла_3.txt
<р>4. Если вы хотите удалить группу файлов с одинаковым расширением, например, файлы, заканчивающиеся на «.pdf». Вы можете запустить приведенную ниже команду rm вместе с расширением. Эта команда поможет удалить все файлы PDF в текущем рабочем каталоге. <р>5. Эта команда удалит все файлы с расширением pdf. Но если вы введете подстановочный знак, например «?", он удалит файлы с односимвольным расширением. <р>6. Если определенный файл защищен от записи, вам будет предложено подтвердить окончательное удаление этого файла. Если вы хотите продолжить, вы можете нажать «y» и нажать Enter соответственно.Чтобы снизить риск использования команды rm непосредственно для окончательного удаления файла, лучше использовать параметр «-i» вместе с командой rm, чтобы запросить подтверждение удаления.
<р>7. Если вы хотите принудительно удалить файл, вы можете использовать параметр «-f» вместе с командой rm, даже если конкретный файл имеет разрешение на запись для этого файла.Как удалить каталоги в Linux с помощью rm
<р>1. Если вы удаляете пустые каталоги, вы можете указать параметр «-d» вместе с командой rm. Кроме того, вы можете использовать подстановочные знаки (* и ?) в именах каталогов, аналогичных именам файлов. <р>2. Если вы хотите удалить несколько каталогов, вы можете указать разные каталоги после команды rm, разделенные пробелами, как показано ниже.rm -d каталог1 каталог2 /путь/к/каталогу3
<р>3. Если вы удаляете каталог, который не пуст, вы можете использовать параметр «-r» вместе с командой rm для рекурсивной операции. Он удалит каталоги вместе с файлами внутри них.rm -r каталог1 каталог2 каталог3
<р>4. Если каталог защищен от записи, вам будет предложено предоставить разрешение на удаление этого каталога. Для удаления каталогов, которые не являются пустыми, а также для подавления подсказки, вы можете использовать следующую команду с параметрами «-r» и «-f».rm -rf директория
<р>5. При выполнении вышеуказанной команды вы должны быть осторожны, так как она удалит файл в Linux без какого-либо запроса и не сможет быть восстановлена. Поэтому убедитесь, что у вас есть правильное понимание структуры каталогов. Для решения этой проблемы вы можете использовать команду дерева.Но сначала вам нужно установить пакет для использования команды дерева в вашем дистрибутиве Unix или Linux.
Дерево установки sudo apt-get
<р>6. Если вы запустите команду «дерево», вы получите древовидную диаграмму структуры каталогов и файлов, хранящихся в нем.Удаление каталога Linux с помощью rmdir
Для удаления каталога вы также можете использовать команду rmdir. Но основное различие между использованием команд rm и rmdir заключается в том, что команда rmdir поможет удалить те каталоги, которые пусты. Его нельзя использовать для удаления файлов.
- В Linux одной из самых простых команд для удаления пустого каталога является команда rmdir. Но вы не можете использовать эту команду для удаления нескольких каталогов, как это возможно с помощью команды rm.
- Для удаления нескольких пустых каталогов можно использовать следующий формат команды.
rmdir каталог1 каталог2 каталог3
- Если определенный каталог, который вы хотите удалить, не находится в текущем рабочем каталоге, вы можете указать путь к этому каталогу, как показано ниже.
- Если вы используете команду rmdir для удаления непустого каталога Linux, вы получите сообщение об ошибке.
Если вы хотите удалить каталог вместе с его родительским каталогом, вы можете использовать параметр «-p» с командой rmdir. Это возможно, так как команда rmdir запустится из целевого каталога, а затем переместится в родительский каталог. Теперь целевой каталог будет пуст, поэтому его можно будет удалить с помощью команды rmdir. Процесс будет повторяться до тех пор, пока путь не будет предоставлен команде rmdir.
Заключение
Мы видели, как можно удалять файлы и каталоги в операционной системе Linux с помощью команд rm или rmdir.
При удалении конфиденциальных данных или папок соблюдайте строгую осторожность, поскольку их невозможно восстановить, если файл будет уничтожен. Мы также увидели, как использовать функции rm с различными командами мнений, доступными в операционной системе Linux. Регулярное выражение также можно использовать с командой rm в Linux.
Дэйв Маккей
Дэйв Маккей
Писатель
Команды rm и rmdir удаляют файлы и каталоги в Linux, macOS и других Unix-подобных операционных системах. Они аналогичны командам del и deltree в Windows и DOS. Эти команды очень мощные и имеют довольно много параметров.
Важно отметить, что файлы и каталоги, удаленные с помощью rm и rmdir, не перемещаются в корзину. Они немедленно удаляются с вашего компьютера. Если вы случайно удалите файлы с помощью этих команд, восстановить их можно будет только из резервной копии.
Как удалить файлы с помощью rm
Самый простой случай — удаление одного файла в текущем каталоге. Введите команду rm, пробел и имя файла, который вы хотите удалить.
Если файл находится не в текущем рабочем каталоге, укажите путь к местоположению файла.
Вы можете передать более одного имени файла в rm . При этом будут удалены все указанные файлы.
Подстановочные знаки можно использовать для выбора групп файлов, которые необходимо удалить. * представляет собой несколько символов, а ? представляет один символ. Эта команда удалит все файлы изображений png в текущем рабочем каталоге.
Эта команда удалит все файлы с односимвольным расширением. Например, это удалит File.1 и File.2, но не File.12.
Если файл защищен от записи, вы получите запрос перед удалением файла. Вы должны ответить y или n и нажать «Ввод».
Чтобы снизить риск использования rm с подстановочными знаками, используйте параметр -i (интерактивный). Это требует подтверждения удаления каждого файла.
Параметр -f (принудительно) противоположен интерактивному. Подтверждение не запрашивается, даже если файлы защищены от записи.
Как удалить каталоги с помощью rm
Чтобы удалить пустой каталог, используйте параметр -d (каталог). Вы можете использовать подстановочные знаки ( * и ? ) в именах каталогов так же, как и в именах файлов.
Указание более одного имени каталога приводит к удалению всех указанных пустых каталогов.
Чтобы удалить каталоги, которые не пусты, используйте параметр -r (рекурсивный). Чтобы было ясно, это удаляет каталоги и все файлы и подкаталоги, содержащиеся в них.
Если каталог или файл защищены от записи, вам будет предложено подтвердить удаление. Чтобы удалить каталоги, которые не пусты, и подавить эти подсказки, используйте вместе параметры -r (рекурсивный) и -f (принудительный).
Здесь требуется осторожность. Ошибка с командой rm -rf может привести к потере данных или сбою системы. Это опасно, и осторожность — лучшая политика. Чтобы получить представление о структуре каталогов и файлах, которые будут удалены командой rm -rf, используйте команду дерева.
Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux вместо этого используйте инструмент управления пакетами вашего дистрибутива Linux.
Выполнение команды дерева создает простую для понимания диаграмму структуры каталогов и файлов в каталоге, из которого она запущена.
Вы также можете указать путь к команде дерева, чтобы она запускала дерево из другого каталога в файловой системе.
У команды rm также есть параметры --one-file-system, --no-preserve-root, --preserve-root, но они рекомендуются только опытным пользователям. Если вы что-то сделаете не так, вы можете случайно удалить все системные файлы. Обратитесь к странице руководства команды для получения дополнительной информации.
Как удалить каталоги с помощью rmdir
Есть еще одна команда, называемая rmdir , которую вы можете использовать для удаления каталогов. Разница между rm и rmdir заключается в том, что rmdir может удалять только пустые каталоги. Он никогда не удалит файлы.
Простейшим случаем является удаление одного пустого каталога. Как и в случае с rm , вы можете передать несколько имен каталогов в rmdir или путь к каталогу.
Удалить один каталог в текущем каталоге, передав его имя в rmdir :
Удалить несколько каталогов, передав список имен в rmdir :
Удалить каталог, не входящий в текущий каталог, указав полный путь к этому каталогу:
Если вы попытаетесь удалить непустую папку, rmdir выдаст вам сообщение об ошибке. В следующем примере rmdir успешно и без вывода сообщений удаляет каталог клиентов, но отказывается удалять каталог проектов, поскольку он содержит файлы. Каталог проектов остался таким же, как и был, и файлы в нем остались нетронутыми.
Когда rmdir выдает ошибку «Каталог не пуст», он прекращает обработку каталогов, которые были переданы ему в командной строке. Если вы попросили его удалить четыре каталога, а в первом были файлы, rmdir выдаст вам сообщение об ошибке и больше ничего не сделает. Вы можете заставить его игнорировать эти ошибки с помощью параметра --ignore-fail-on-non-empty, чтобы обрабатывались другие каталоги.
В следующем примере в rmdir были переданы две папки: work/reports и work/quotes. В команду включен параметр --ignore-fail-on-non-empty. В папке work/reports есть файлы, поэтому rmdir не может их удалить. Опция --ignore-fail-on-non-empty заставляет rmdir игнорировать ошибку и переходить к следующей папке, которую необходимо обработать, это work/quotes . Это пустая папка, и rmdir ее удаляет.
Это была использованная команда.
Вы можете использовать параметр -p (parents) для удаления каталога, а также для удаления его родительских каталогов. Этот трюк работает, потому что rmdir начинается с целевого каталога, а затем возвращается к родительскому. Теперь этот каталог должен быть пуст, чтобы его можно было удалить с помощью rmdir , и процесс повторяется, возвращаясь к пути, указанному для rmdir .
В следующем примере в rmdir передается команда:
И счета-фактуры, и рабочие каталоги удаляются в соответствии с запросом.
Используете ли вы Bash или любую другую оболочку, Linux предоставляет гибкие и мощные команды для удаления каталогов и файлов прямо из командной строки терминала. Некоторые люди предпочитают, чтобы рабочий процесс вращался вокруг терминала. У других может не быть выбора в этом вопросе. Они могут работать на серверах без установленного графического интерфейса или в удаленном сеансе безголовой системы, такой как Raspberry Pi. Эти команды идеально подходят для этой группы людей.
Но какой бы рабочий процесс вы ни предпочли, эти команды очень хорошо подходят для включения в сценарии оболочки. Если сценарий запускается заданием cron, он может помочь автоматизировать рутинные задачи по обслуживанию, такие как очистка ненужных файлов журнала. Если вы исследуете этот вариант использования, помните о силе этих команд, тщательно проверяйте все и всегда сохраняйте последнюю резервную копию.
Команды Linux | |
Файлы | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm |
Процессы | alias · screen · top · nice · renice · прогресс · strace · systemd · tmux · chsh · история · at · пакетное · бесплатное · которое · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · стена · yes · kill · спать · sudo · su · время · groupadd · usermod · группы · lshw · выключение · перезагрузка · halt · poweroff · passwd · lscpu · crontab · date · bg · fg |
Сеть | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · копать · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
- › Как восстановить удаленные файлы в Linux с помощью testdisk
- › Как использовать команду «да» на Mac
- › Как безопасно удалить файлы в Linux
- › Как использовать BleachBit в Linux
- ›5 шрифтов, которые следует прекратить использовать (и лучшие альтернативы)
- › Худшее, что есть в телефонах Samsung, — это программное обеспечение Samsung.
- › Как установить Google Play Маркет в Windows 11
- › Почему прозрачные чехлы для телефонов желтеют?
Примечание. Если вы считаете, что каталог неуместен, и вы не хотите его удалять, попробуйте переместить его в другое место. Чтобы узнать, как это сделать, посетите нашу статью Как перемещать каталоги в Linux.
Как удалить файлы Linux
Команда rm удаляет файлы в Linux.Команда отменяет связь данных с именем файла, позволяя пользователю перезаписать это конкретное место хранения.
Чтобы удалить один файл, введите в командной строке следующее:
Команду rm можно использовать для одновременного удаления нескольких файлов:
С этой командой можно использовать подстановочные знаки.
Например, чтобы удалить все файлы с именем .bmp, введите:
Этот метод также используется для удаления всех файлов, содержащих строку символов:
Это удалит все файлы, в имени которых есть образец слова.
Система выполнит поиск в текущем каталоге файла, который вы хотите удалить.
Чтобы удалить файл из другого каталога, либо сначала перейдите в этот каталог:
Или вы можете напрямую указать расположение файла в одной команде:
Примечание. После того как команда rm удалит файл, вы не сможете получить к нему доступ. Единственный способ получить файл — это восстановить его из резервной копии (если она доступна).
Параметры команды rm
Вы можете настроить работу команды rm, добавив параметры. Параметр — это дефис, за которым следует одна или несколько букв, обозначающих команды.
Если вы удаляете несколько файлов, добавьте запрос на подтверждение. Используйте параметр –i для использования интерактивного диалога:
Подтвердите удаление файлов, введя «да» или «нет».
Чтобы отобразить ход удаления с помощью команды v или verbose:
Вывод подтверждает, что файл test.txt был успешно удален.
Чтобы принудительно удалить файл, защищенный от записи, используйте параметр –f:
Чтобы использовать привилегии sudo для файла с надписью "Отказано в доступе" и удалить его:
Как удалить каталог в Linux
Каталог linux (или папка) может быть пустым или содержать файлы. Чтобы удалить каталог в Linux, используйте одну из следующих двух команд:
- команда rmdir — удаляет пустые каталоги/папки
- команда rm — удаляет каталог/папку вместе со всеми файлами и подкаталогами в ней
Удалить каталог Linux с помощью команды rm
Добавив параметр -r (-R) к команде rm, вы можете удалить каталог вместе со всем его содержимым.
Чтобы удалить каталог (и все, что внутри него), используйте параметр –r, как в команде:
Появится запрос на подтверждение перед удалением.
Чтобы удалить каталог без подтверждения:
Кроме того, вы можете удалить несколько каталогов или папок одновременно:
Удалить каталоги в Linux с помощью команды rmdir
Помните, что команда rmdir используется только при удалении пустых папок и каталогов в Linux. Если указанный каталог не пуст, вывод отображает ошибку.
Основной синтаксис, используемый для удаления пустых папок/каталогов Linux:
Кроме того, вы можете удалить сразу несколько пустых каталогов, набрав:
Если команда находит контент в одном из перечисленных каталогов, она пропустит его и перейдет к следующему.
Примечание. Чтобы безвозвратно удалить файл в Linux путем его перезаписи, используйте команду shred.
С помощью этого руководства удаление файлов и каталогов в Linux стало проще. Команды rm и rmdir являются гибкими с множеством доступных опций.
Не очень нравится. Мы можем использовать команду unlink для безвозвратного удаления одного файла.
2. Удалить один файл:
Команда rm, упрощающая одновременное удаление одного или нескольких файлов, является более широко используемой командой для удаления файлов.
Если файл защищен от записи, rm попросит вас подтвердить его удаление; в противном случае он удалит его без запроса. Использование флага «-i», чтобы заставить rm запрашивать подтверждение перед удалением файла:
Команда rm удаляет файлы без отображения каких-либо сообщений. Используйте команду rm с флагом -v, чтобы увидеть, что в данный момент делает команда rm.
Использование флага -f для удаления файлов, защищенных от записи, без запроса разъяснений.
3. Можно удалить несколько файлов:
Не передавая несколько имен файлов в качестве аргументов для rm, вы можете удалить несколько файлов.
Регулярные выражения также поддерживаются rm. Если вы хотите удалить все файлы с именем имя-файла-*, введите:
Регулярные выражения также можно использовать для определения разных каталогов. Мы можем использовать что-то вроде удаления трех файлов, соответствующих имени файла-1, имени файла-2 и имени файла-3.
4. Удалить архив:
Команду rm с флагом -d можно использовать для удаления пустого каталога.
Поддерживаемые параметры удаления файла также можно комбинировать с удалением каталога с помощью флага -d.
Использование флага -r для удаления непустого каталога.
Если вам не нужен запрос перед удалением каталога и его содержимого, используйте флаг -rf. Это удалит все внутри каталога, включая сам каталог, без какого-либо подтверждения. Будьте осторожны, особенно при использовании в качестве root.
5. Найдите и удалите файлы:
Мы можем использовать команду locate с различными вариантами для более сложных спецификаций. Чтобы удалить все файлы по указанному пути, следуйте шаблону .
Пример:
Мы можем немного изменить приведенную выше команду, чтобы удалить все, что соответствует последовательности >, включая каталоги внутри:
Внутри современные реализации команды find поддерживают функцию удаления. Флаг -delete используется для переопределения инструкции rm, а флаг –depth указывает find обрабатывать содержимое каталога перед самим каталогом:
6. Пустые файлы должны быть найдены и удалены:
Вы можете использовать следующую команду, чтобы удалить все пустые каталоги в пределах заданного пути от каталога к поиску:
Вместо этого используйте следующую команду, чтобы удалить все пустые файлы по заданному пути каталог-поиск:
7. Разрешения используются для поиска и удаления файлов:
Теперь мы можем удалять файлы на основе специальных разрешений, таких как:
Рассмотрите следующий сценарий:
Простые команды (unlink), (rm) и (rmdir) доступны в Linux, и их можно быстро расширить с помощью регулярных выражений. Для более специализированных потребностей вы должны использовать различные методы, такие как (найти), для достижения ваших целей. Помимо примеров в этом посте, вы можете настроить свой квест, используя поиск с любым из доступных флагов.
Часто запускайте команды find без флагов rm или -delete и проверяйте вывод, чтобы определить, какие файлы или папки могут быть затронуты выполнением программы. Настройка и процедура резервного копирования полезны не только в случае непреднамеренного удаления, но и в случае аппаратных ошибок и кибератак.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
1. Обзор
В командной строке Linux мы можем использовать команду find для получения списка файлов или каталогов. Обычно мы хотим выполнить некоторые операции с найденными файлами, например, найти и tar файлы.
В этом руководстве мы рассмотрим, как удалить найденные файлы или каталоги.
2. Введение в проблему
Существует несколько способов удаления файлов и каталогов, найденных с помощью команды find. Это не сложная проблема. Возможно, у нас уже есть какие-то решения.
Однако некоторые решения могут быть опасными, если мы их неправильно используем. Кроме того, некоторые решения могут работать неэффективно с точки зрения производительности.
В оставшейся части этого руководства мы более подробно рассмотрим распространенную ошибку при использовании команды find и объясним, почему это опасно.
Кроме того, мы также обсудим производительность.
Во-первых, давайте в качестве примера создадим структуру каталогов:
Как видно из выходных данных tree выше, мы создали каталог test с несколькими подкаталогами и файлами.
Мы попробуем два удаления в каталоге test:
- Удаление файла: удалите все файлы любой.txt .
- Удаление каталога: удалите все каталоги .git и файлы в них
Давайте посмотрим на команды find, чтобы найти целевые каталоги и файлы.
Сначала найдем все файлы whatever.txt:
Точно так же мы можем найти каталоги .git:
В этом руководстве мы представим три подхода к удалению целевых файлов и каталогов:
- Использование действия -delete команды найти
- Использование find -exec
- Использование найти | xargs rm
До сих пор мы видели, как найти файлы или каталоги, которые мы хотим удалить, с помощью команды find. Кроме того, мы знаем, что можем соединять команды Linux с помощью конвейеров и позволять различным командам совместно решать наши проблемы.
Многие из нас могут подумать, что самым простым способом решения этой проблемы будет передача результата find в команду rm. Что немного удивительно, так это то, что его нет в списке выше.
Поэтому, прежде чем мы рассмотрим реальные решения проблемы, давайте разберемся, почему мы не можем передать результат find в rm.
3. Почему «найти… | rm” Не сработает?
Прежде чем ответить на этот вопрос, нам нужно понять, что делает канал. Прежде всего, давайте посмотрим на пример:
В приведенном выше простом примере мы передаем результат команды ls в grep и находим корневые каталоги, имена которых начинаются с «m».
Проще говоря, здесь конвейер преобразует стандартный вывод (Stdout) команды ls в стандартный ввод (Stdin) команды grep.
Эта команда работает, потому что команда grep принимает чтение из стандартного ввода. Мы можем передать стандартный вывод другим командам, поддерживающим чтение из стандартного ввода, например:
Такую «цепочку команд» можно часто увидеть в реальном мире.
Однако не все команды Linux поддерживают чтение из стандартного ввода. Типичными примерами являются команды, выполняющие обработку файлов, например, cp, mv и rm. Эти команды игнорируют стандартный ввод.
Например, когда мы выполняем команду «rm file», rm принимает аргумент командной строки file, который указывает файл. Он вообще не будет читать стандартный ввод:
Поэтому идея «найти…. | rm» тоже не сработает.
Однако иногда мы хотели бы каким-то образом превратить стандартный вывод одной команды в аргумент другой команды. Вот где xargs пригодится. Мы увидим его в действии в следующих разделах.
Теперь давайте рассмотрим решения нашей проблемы «найти и удалить».
4. Использование команды find и действия -delete
Команда find предоставляет действие -delete для удаления файлов. Затем давайте удалим целевые файлы и каталоги, используя это действие.
4.1. Удаление целевых файлов и каталогов
Мы можем удалить все файлы независимо.txt, добавив параметр -delete в команду find:
Хорошо, работает. Все файлы независимо.txt были удалены.
Далее восстановим каталог test и попробуем рекурсивно удалить каталоги .git:
К сожалению, на этот раз мы получили сообщения об ошибках. Это связано с тем, что действие -delete не может рекурсивно удалить непустой каталог. То есть он может удалять только файлы и пустые каталоги.
4.2.Опасная ловушка использования -delete
Далее проведем интересный тест. Мы знаем, что порядок параметров команды Linux обычно не имеет значения.
Например, следующие две команды ls идентичны, несмотря на то, что параметры расположены в другом порядке:
Теперь давайте изменим порядок параметров в нашей последней команде find, переместив параметр -delete на первую позицию, и посмотрим, что произойдет:
На этот раз сообщения об ошибке нет. Это означает, что команда выполнена успешно.
Однако, проверив результат, мы обнаружили, что каталог test был полностью удален! Давайте разберемся, почему это произошло.
Давайте вернемся к нашей команде find. Мы можем вызвать три параметра: -delete, -type d и -name ‘.git’. Однако не следует забывать, что find также рассматривает их как три выражения.
Выражение в команде find будет оцениваться, возвращая логическое значение, а действие -delete всегда возвращает значение true.
Если действие -delete находится на первой позиции, во время его оценки оно удалит данный каталог и все в нем, то есть каталог test в наш пример.
Но подождите — мы только что узнали, что действие -delete не удаляет непустые каталоги. Почему все, что находится под test, было удалено?
Это связано с тем, что действие -delete подразумевает параметр -depth.
Опция -depth запрашивает команду find для поиска содержимого каждого каталога перед самим каталогом. Поэтому, если мы поместим -delete в качестве первой опции, удаление начнется с самого низа каждого дерева каталогов. Сначала он удаляет все файлы в каталоге, затем сам пустой каталог, пока все не будет удалено.
Когда мы используем команду найти, мы должны помнить, что мы никогда не должны помещать действие -delete на первую позицию. Если мы это сделаем, он может неожиданно удалить файлы.
5. Использование find -exec
Когда мы используем команду find с действием -exec, мы можем выполнять внешние команды над ее результатом. Теперь давайте выполним команду rm, чтобы удалить наши целевые файлы и каталоги следующим образом:
Хорошо, все файлы независимо.txt удалены. Когда мы используем -exec с внешней командой, она заполняет каждый найденный файл заполнителем ‘<>’.
Аналогичным образом мы можем удалить все каталоги .git, если добавим параметр -r в команду rm. Давайте восстановим каталог test и попробуем:
Как видно из выходных данных, все каталоги .git успешно удалены.
6. С помощью найти | xargs rm Комбинация
Теперь мы узнали, что можем выполнить команду rm, используя действие find –exec. В качестве альтернативы мы также можем передать результат команды find в xargs и позволить xargs вызвать команду rm для удалите эти файлы.
Далее посмотрим, как удалить все файлы whatever.txt, используя этот подход:
Точно так же мы можем удалить все каталоги .git. Давайте восстановим каталог test и протестируем его:
Как показано выше, все каталоги .git были удалены.
Мы можем спросить: если find -exec rm может решить проблему, зачем нам нужно вводить дополнительный процесс xargs, чтобы сделать то же самое?
Чтобы узнать ответ, давайте обсудим их эффективность.
7. Сравнительный анализ производительности команд find -exec и find | аргументы
Во-первых, давайте объясним, как работает метод find -exec rm. Когда мы используем этот подход, процесс rm будет выполняться для каждого файла, найденного командой find. То есть мы выполним команду rm миллион раз, если команда find найдет миллион файлов.
С другой стороны, если мы выполним find | xargs rm, xargs соберет найденные файлы в пакеты и запустит их с помощью команды как можно меньше раз.
Поэтому, если наша команда find возвращает большое количество файлов или каталогов, find | xargs COMMAND будет намного быстрее, чем метод find -exec COMMAND.
Далее давайте проведем один и тот же тест производительности для каждого подхода и сравним их производительность.
Мы удалим 3000 файлов с помощью каждой команды и измерим время их выполнения с помощью команды time.
Сначала давайте проверим подход find -exec rm:
На этом компьютере удаление всех файлов заняло около шести секунд.
Теперь очередь за xargs. Посмотрим, сможет ли он выполнить тот же тест быстрее:
На этот раз удаление файлов заняло всего 0,05 секунды.По сравнению с подходом find -exec rm использование xargs в этом тесте в 120 раз быстрее! Вау!
Поэтому, если find возвращает большое количество файлов, следует рассмотреть возможность передачи результата команде xargs.
8. Заключение
В этой статье мы узнали о трех различных способах удаления файлов или каталогов, найденных с помощью команды find. Кроме того, мы поняли, почему передача результатов find в rm не работает.
Кроме того, мы обсудили опасную ловушку использования действия find в -delete на примере.
Наконец, мы также проанализировали производительность двух подходов: find -exec rm и find | xargs rm.
Если у вас есть несколько лет опыта работы с экосистемой Linux и вы хотите поделиться этим опытом с сообществом, ознакомьтесь с нашими Правилами участия.
Читайте также: