Linux вывести список файлов по маске
Казалось бы, простая задачка. В Windows все просто - del /S smth.*, готово. Все файлы по маске smth.* в текущей директории и ниже будут удалены.
Может есть ещё какие нибудь способы??
Жестоко
> Может есть ещё какие нибудь способы?
См. -delete в `man find`.
В *nix все просто - rm -r smth.*, готово. Все файлы по маске smth.* в текущей директории и ниже будут удалены.что значит не работает?
права то на удаление есть?
какую ошибку пишет?
/test$ ls -R
.:
smth.123 smth.1231 smth.12311 -smth sd.1231 smth sd.1231 test
./test:
smth.123 smth.1231 smth.12311 -smth ss.111 smth ss.111
rr@pc:
/test$ rm -rvf *smth*
rm: invalid option -- s
Try `rm ./'-smth sd.1231'' to remove the file `-smth sd.1231'.
Try `rm --help' for more information.
rr@pc:
/test$ ls -R
.:
smth.123 smth.1231 smth.12311 -smth sd.1231 smth sd.1231 test
./test:
smth.123 smth.1231 smth.12311 -smth ss.111 smth ss.111
rr@pc:
/test$ ls -R
.:
gentest.sh smth.123 smth.1231 smth.12311 -smth sd.1231 smth sd.1231 test
./test:
smth.123 smth.1231 smth.12311 -smth ss.111 smth ss.111
rr@pc:
/test$ rm -- *smth*
rr@pc:
./test:
smth.123 smth.1231 smth.12311 -smth ss.111 smth ss.111
rr@pc:
У нас в конторе один из любимейших вопросов на собеседовании: как удалить сто тыщ мильонов файлов с заранее неизвестными названиями в одной директории?
Ответы типа "rm -f /path/to/dir/*" не подходят, поскольку звездочка преобразовывается в список файлов, удовлетворяющих wildmat'у (в данном случае -- все файлы), а у шелла есть ограничение на размер командной строки.
Тот же результат будет у "find /path/to/dir -type f| xargs rm", поскольку, во-первых xargs преобразует весь stdin в одну строку (try: "find /tmp |xargs echo rm"), во-вторых, в именах файлов могут содержаться пробелы, которые не эскейпятся, в-третьих, названия файлов могут начинаться на -, из-за чего rm воспримет имя файла как неизвестную опцию и упадет. Ну и ограничение на длину команды никто не отменял. Первые три проблемы обходятся так:
find /path/to/dir -type f -print0 |xargs -0 rm --
Опция -print0 какбэ говорит команде find, что в качестве разделителей нужно использовать нулевой символ вместо перевода строки, а -0 указывает xargs, что разделитель -- не пробел, а все тот же нулевой символ.
Поэтому правильным ответом считается команда
find . -type f -name 'smth*' -delete
или
find . -type f -name 'smth' -exec rm -f -- "<>" \;
Ну или простенький цикл:
for f in "`find . -type f -name 'smth*'`" ; do rm "$f"; done
по количеству кавычек в котором можно еще и определить степень знания особенностей использования шелла :)
а про опцию -n забыли?
Спасибо!
Большое спасибо за понятный мануал, очень помогло.Второй способ, кстати, не работает - пишет "missing arguments for -exec". Система Ubuntu 8.10, ядро 2.6.27
И, наконец, вот команда, которая будет выполнена для каждого файла:
-exec ln <> /var/www/obsolete \;
Здесь вы также должны дезактивировать знак ;, в противном случае командный процессор интерпретирует его как разделитель команд. Если вы забудете сделать это, find пожалуется, что для -exec отсутствует аргумент.
Иногда критически важно быстро найти нужный файл или информацию в системе. Порой можно ограничиться стандартами функциями поиска, которыми сейчас обладает любой файловый менеджер, но с возможностями терминала им не сравниться.
Команда find – это невероятно мощный инструмент, позволяющий искать файлы не только по названию, но и по:
- Дате добавления.
- Содержимому.
- Регулярным выражениям.
Данная команда будет очень полезна системным администраторам для:
- Управления дисковым пространством.
- Бэкапа.
- Различных операций с файлами.
Команда find в Linux производит поиск файлов и папок на основе заданных вами критериев и позволяет выполнять действия с результатами поиска.
Синтаксис команды find:
- directory-to-search (каталог поиска) – это отправной каталог, с которой find начинает поиск файлов по всем подкаталогам, которые находятся внутри. Если не указать путь, тогда поиск начнется в текущем каталоге;
- criteria (критерий) – критерий, по которым нужно искать файлы;
- action (действие) – что делать с каждым найденным файлом, соответствующим критериям.
Поиск по имени
Следующая команда ищет файл s.txt в текущем каталоге:
- . (точка) – файл относится к нынешнему каталогу
- -name – критерии по которым осуществляется поиск. В данном случае поиск по названию файла.
В данном случае критерий -name учитывает только символы нижнего регистра и файл S.txt не появиться в результатах поиска. Чтобы убрать чувствительность к регистру необходимо использовать –iname.
Для поиска всех изображений c расширением .jpg нужно использовать шаблон подстановки *.jpg:
Можно использовать название каталога для поиска. Например, чтобы с помощью команды find найти все png изображения в каталоге home:
Поиск по типу файла
Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:
- f – простые файлы;
- d – каталоги;
- l – символические ссылки;
- b – блочные устройства (dev);
- c – символьные устройства (dev);
- p – именованные каналы;
- s – сокеты;
Например, указав критерий -type d будут перечислены только каталоги:
Поиск по размеру файла
Допустим, что вам необходимо найти все большие файлы. Для таких ситуаций подойдет критерий -size.
- "+" — Поиск файлов больше заданного размера
- "-" — Поиск файлов меньше заданного размера
- Отсутствие знака означает, что размер файлов в поиске должен полностью совпадать.
В данном случае поиск выведет все файлы более 1 Гб (+1G).
Единицы измерения файлов:
Поиск пустых файлов и каталогов
Критерий -empty позволяет найти пустые файлы и каталоги.
Поиск времени изменения
Критерий -cmin позволяет искать файлы и каталоги по времени изменения. Для поиска всех файлов, измененных за последний час (менее 60 мин), нужно использовать -60:
Таким образом можно найти все файлы в текущем каталоге, которые были созданы или изменены в течение часа (менее 60 минут).
Для поиска файлов, которые наоборот были изменены в любое время кроме последнего часа необходимо использовать +60.
Поиск по времени доступа
Критерий -atime позволяет искать файлы по времени последнего доступа.
Таким образом можно найти файлы, к которым не обращались последние полгода (180 дней).
Поиск по имени пользователя
Опция –user username дает возможность поиска всех файлов и каталогов, принадлежащих конкретному пользователю:
Таким образом можно найти все файлы пользователя tisha в каталоге home, а 2>/dev/null сделает выдачу чистой без ошибок в отказе доступа.
Поиск по набору разрешений
Критерий -perm – ищет файлы по определенному набору разрешений.
Поиск файлов с разрешениями 777.
Операторы
Для объединения нескольких критериев в одну команду поиска можно применять операторы:
Например, чтобы найти файлы размером более 1 Гбайта пользователя tisha необходимо ввести следующую команду:
Если файлы могут принадлежать не только пользователю tisha, но и пользователю pokeristo, а также быть размером более 1 Гбайта.
Перед скобками нужно поставить обратный слеш "\".
Действия
К команде find можно добавить действия, которые будут произведены с результатами поиска.
- -delete — Удаляет соответствующие результатам поиска файлы
- -ls — Вывод более подробных результатов поиска с:
- Размерами файлов.
- Количеством inode.
-delete
Полезен, когда необходимо найти и удалить все пустые файлы, например:
Перед удалением лучше лишний раз себя подстраховать. Для этого можно запустить команду с действием по умолчанию -print.
Данное действие является особенным и позволяет выполнить команду по вашему усмотрению в результатах поиска.
- command – это команда, которую вы желаете выполнить для результатов поиска. Например:
- rm
- mv
- cp
С помощью –exec можно написать альтернативу команде –delete и применить ее к результатам поиска:
Другой пример использования действия -exec:
Таким образом можно скопировать все .jpg изображения в каталог backups/fotos
Заключение
Команду find можно использовать для поиска:
- Файлов по имени.
- Дате последнего доступа.
- Дате последнего изменения.
- Имени пользователя (владельца файла).
- Имени группы.
- Размеру.
- Разрешению.
- Другим критериям.
С полученными результатами можно сразу выполнять различные действия, такие как:
- Удаление.
- Копирование.
- Перемещение в другой каталог.
Команда find может сильно облегчить жизнь системному администратору, а лучший способ овладеть ей – больше практиковаться.
Утилита find представляет универсальный и функциональный способ для поиска в Linux. Данная статья является шпаргалкой с описанием и примерами ее использования.
Общий синтаксис
find <где искать> <опции>
<где искать> — путь к корневому каталогу, откуда начинать поиск. Например, find /home/user — искать в соответствующем каталоге. Для текущего каталога нужно использовать точку «.».
<опции> — набор правил, по которым выполнять поиск.
* по умолчанию, поиск рекурсивный. Для поиска в конкретном каталоге можно использовать опцию maxdepth.
Описание опций
Тип объекта поиска. Возможные варианты:
- f — файл;
- d — каталог;
- l — ссылка;
- p — pipe;
- s — сокет.
Также доступны логические операторы:
Оператор Описание -a Логическое И. Объединяем несколько критериев поиска. -o Логическое ИЛИ. Позволяем команде find выполнить поиск на основе одного из критериев поиска. -not или ! Логическое НЕ. Инвертирует критерий поиска. Полный набор актуальных опций можно получить командой man find.
Примеры использования find
Поиск файла по имени
1. Простой поиск по имени:
* в данном примере будет выполнен поиск файла с именем file.txt по всей файловой системе, начинающейся с корня /.
2. Поиск файла по части имени:
* данной командой будет выполнен поиск всех папок или файлов в корневой директории /, заканчивающихся на .tmp
3. Несколько условий.
а) Логическое И. Например, файлы, которые начинаются на sess_ и заканчиваются на cd:
б) Логическое ИЛИ. Например, файлы, которые начинаются на sess_ или заканчиваются на cd:
в) Более компактный вид имеют регулярные выражения, например:
* где в первом поиске применяется выражение, аналогичное примеру а), а во втором — б).
4. Найти все файлы, кроме .log:
* в данном примере мы воспользовались логическим оператором !.
Поиск по дате
1. Поиск файлов, которые менялись определенное количество дней назад:
find . -type f -mtime +60
* данная команда найдет файлы, которые менялись более 60 дней назад.
2. Поиск файлов с помощью newer. Данная опция доступна с версии 4.3.3 (посмотреть можно командой find --version).
а) дате изменения:
find . -type f -newermt "2019-11-02 00:00"
* покажет все файлы, которые менялись, начиная с 02.11.2019 00:00.
find . -type f -newermt 2019-10-31 ! -newermt 2019-11-02
* найдет все файлы, которые менялись в промежутке между 31.10.2019 и 01.11.2019 (включительно).
б) дате обращения:
find . -type f -newerat 2019-10-08
* все файлы, к которым обращались с 08.10.2019.
find . -type f -newerat 2019-10-01 ! -newerat 2019-11-01
* все файлы, к которым обращались в октябре.
в) дате создания:
find . -type f -newerct 2019-09-07
* все файлы, созданные с 07 сентября 2019 года.
find . -type f -newerct 2019-09-07 ! -newerct "2019-09-09 07:50:00"
* файлы, созданные с 07.09.2019 00:00:00 по 09.09.2019 07:50
По типу
Искать в текущей директории и всех ее подпапках только файлы:
* f — искать только файлы.
Поиск по правам доступа
1. Ищем все справами на чтение и запись:
find / -perm 0666
2. Находим файлы, доступ к которым имеет только владелец:
find / -perm 0600
Поиск файла по содержимому
find / -type f -exec grep -i -H "content" <> \;
* в данном примере выполнен рекурсивный поиск всех файлов в директории / и выведен список тех, в которых содержится строка content.
С сортировкой по дате модификации
* команда найдет все файлы в каталоге /data, добавит к имени дату модификации и отсортирует данные по имени. В итоге получаем, что файлы будут идти в порядке их изменения.
Лимит на количество выводимых результатов
Самый распространенный пример — вывести один файл, который последний раз был модифицирован. Берем пример с сортировкой и добавляем следующее:
Поиск с действием (exec)
1. Найти только файлы, которые начинаются на sess_ и удалить их:
find . -name "sess_*" -type f -print -exec rm <> \;
* -print использовать не обязательно, но он покажет все, что будет удаляться, поэтому данную опцию удобно использовать, когда команда выполняется вручную.
2. Переименовать найденные файлы:
find . -name "sess_*" -type f -exec mv <> new_name \;
3. Вывести на экран количество найденных файлов и папок, которые заканчиваются на .tmp:
find . -name "*.tmp" | wc -l
4. Изменить права:
find /home/user/* -type d -exec chmod 2700 <> \;
* в данном примере мы ищем все каталоги (type d) в директории /home/user и ставим для них права 2700.
5. Передать найденные файлы конвееру (pipe):
* в данном примере мы использовали find для поиска строки test в файлах, которые находятся в каталоге /etc, и название которых заканчивается на .conf. Для этого мы передали список найденных файлов команде grep, которая уже и выполнила поиск по содержимому данных файлов.
6. Произвести замену в файлах с помощью команды sed:
find /opt/project -type f -exec sed -i -e "s/test/production/g" <> \;
* находим все файлы в каталоге /opt/project и меняем их содержимое с test на production.
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm <> \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00.
* полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.Мы используем команду Linux ls каждый день, не задумываясь об этом. Какая жалость. Уделите ему немного внимания, и вы найдете много полезных опций, в том числе те, которые вам следует добавить в свой арсенал командной строки.
ls перечисляет файлы и каталоги
Команда ls, вероятно, первая команда, с которой сталкивается большинство пользователей Linux. Те из нас, кто пользуется командной строкой, используют ее изо дня в день, даже не задумываясь об этом. Это может объяснить, почему в этой команде есть нечто большее, чем думает большинство пользователей. Мы перечисляем файлы с ним, чтобы увидеть, что находится в каталоге. Мы перечисляем файлы в длинном формате, когда хотим посмотреть права доступа к файлу. Кроме того, этому мало внимания.
Полезные перестановки команды ls с их строками опций и параметров являются идеальными кандидатами для псевдонимов. Фактически, в большинстве дистрибутивов то, что вы называете «голой» командой ls, на самом деле является псевдонимом. Помимо прочего, команду type можно использовать для показать основное определение псевдонимов . Давайте посмотрим на определение ls:
Параметры –color = auto включаются автоматически каждый раз, когда вы используете команду ls. Это то, что обеспечивает разные цвета для разных типов файлов в списках.
Простые листинги ls
Каждый, кто какое-то время пользовался терминалом Linux, знает, что по умолчанию ls перечисляет файлы и каталоги в текущем каталоге.
Если вы хотите, чтобы ваш список отображался в одном столбце, используйте параметр -1 (один файл в строке):
Мы обсудим это странно выглядящее имя файла в верхней части списка через минуту.
Использование ls в разных каталогах
Когда ls перечисляет содержимое первого каталога, он перечисляет содержимое второго. Он печатает имя каждого каталога по мере их обработки:
Использование шаблонов файлов
Чтобы вывести список файлов с расширением «.c», используйте следующий формат:
Вы также можете использовать ls с grep и использовать grep возможности сопоставления с образцом . Давайте поищем любые файлы, в названии которых есть строка «_pin_»:
Это почти то же самое, что и использование ls отдельно, с двумя подстановочными знаками:
Почему почти то же самое? Обратите внимание на разные макеты. grep заставляет вывод использовать одно имя файла в формате строки.
Проверь это - 7 основных приложений для Linux, которые необходимо установить каждому пользователюНепечатаемые символы
Можно обнаружить, что имя файла имеет непечатаемый или управляющий символ в его имени файла. Обычно это может произойти, когда вы расширяете архив, который вы скачали из Интернета или извлекаете из репозитория git, и исходный автор допустил ошибку при создании файла, но не заметил ее.
Если мы посмотрим на него в браузере файлов и нажмем «F2», чтобы переименовать его, непечатаемые символы будут представлены странным символом.
Вы можете использовать опцию -b (escape), чтобы увидеть, что на самом деле содержит имя файла. Эта опция заставляет ls использовать escape-последовательности Язык программирования C для представления управляющих символов.
Таинственный символ оказывается символом новой строки, представленным в C как «n».
Игнорирование файлов
Чтобы определенные файлы были исключены из списка, используйте параметр –hide. Предположим, вы не хотите видеть резервные файлы «.bak» в списке. Вы можете использовать эту команду:
Файлы «.bak» не включены во второй список.
Листинг в длинном формате
Параметр -l (длинный список) заставляет ls предоставлять подробную информацию о каждом файле.
Здесь много информации, так что давайте рассмотрим ее подробнее.
Самый первый символ представляет тип файла. Это будет один из:
-: обычный файл.
b: специальный файл блока.
c: специальный символьный файл.
d: Каталог.
l: символическая ссылка.
n: сетевой файл.
p: именованный канал.
s: розетка.Следующие девять символов представляют собой три группы по три символа, отображаемых подряд. Каждая группа из трех представляет разрешения на чтение, запись и выполнение в указанном порядке. Если разрешение предоставлено, будет присутствовать r, w или x. Если разрешение не предоставлено, отображается дефис -.
Проверь это - Как использовать команду join в LinuxИногда разрешение на выполнение для владельца представлено буквой s. Это Setuid немного. Если он присутствует, это означает, что файл выполняется с привилегиями владельца файла, а не пользователя, выполняющего файл.
Разрешение на выполнение для группы также может быть s. Это Setgid немного. Когда это применяется к файлу, это означает, что файл будет выполнен с привилегиями группы владельца. При использовании с каталогом любые файлы, созданные внутри него, будут получать свои групповые разрешения из каталога, в котором они создаются, а не от пользователя, который создает файл.
Разрешение на выполнение для остальных иногда может быть представлено буквой t. Это липкий кусочек . Обычно применяется к каталогам. Если он установлен, независимо от прав записи и выполнения, установленных для файлов в каталоге, только владелец файла, владелец каталога или пользователь root могут переименовывать или удалять файлы в каталоге.
Обычно липкий бит используется в таких папках, как «/ tmp». Это доступно для записи всем пользователям компьютера. Бит залипания в каталоге гарантирует, что пользователи и процессы, запущенные пользователями, могут переименовывать или удалять только свои временные файлы.
Мы видим липкий бит в каталоге «/ tmp». Обратите внимание на использование параметра -d (каталог). Это заставляет ls сообщать подробную информацию о каталоге. Без этой опции ls будет сообщать о файлах внутри каталога.
Далее отображаются имя владельца и группа. За ними следует размер файла и дата последнего изменения файла. Наконец, дается имя файла.
Удобочитаемые размеры файлов
Не всегда удобно указывать размеры файлов в байтах. Чтобы увидеть размеры файлов в наиболее подходящих единицах (килобайтах, мегабайтах и т. Д.), Используйте параметр -h (удобочитаемый):
Отображение скрытых файлов
Чтобы увидеть скрытые файлы, используйте параметр -a (все):
Две записи «.» и «..» представляют текущий каталог и родительский каталог соответственно. Файл с именем «.base_settings» теперь отображается впервые.
Опуская. и .. из списков
Если вы не хотите, чтобы ваше объявление было загромождено знаком «.» и «..», но вы хотите видеть скрытые файлы, используйте параметр -A (почти все):
Скрытый файл по-прежнему отображается, но с пометкой «.» и «..» подавляются.
Проверь это - Как удалить ненужные файлы с ПК с Linux с помощью SweeperРекурсивный листинг каталогов
Чтобы ls отображал файлы во всех подкаталогах, используйте параметр -R (рекурсивный)
ls проходит через все дерево каталогов под начальным каталогом и перечисляет файлы в каждом подкаталоге.
Отображение UID и GID
Чтобы вместо имени пользователя и имени группы отображались идентификатор пользователя и идентификатор группы, используйте параметр -n (числовой uid и gid).
Сортировка объявлений
Вы можете отсортировать список по расширению, размеру файла или времени изменения. Эти параметры необязательно использовать с форматом длинного списка, но обычно это имеет смысл. Если вы выполняете сортировку по размеру файла, имеет смысл увидеть размеры файлов в списке. Когда вы сортируете по типу расширения, формат длинного списка не так важен.
Для сортировки по расширению используйте параметр -X (сортировка по расширению).
Сначала перечисляются каталоги (без расширений), затем в алфавитном порядке следуют остальные в соответствии с расширениями.
Для сортировки по размеру файла используйте параметр -S (сортировка по размеру файла).
Порядок сортировки от наибольшего к наименьшему.
Чтобы отсортировать список по времени изменения, используйте параметр -t (сортировать по времени изменения).
Список отсортирован по времени модификации.
Если время изменения файла находится в пределах текущего года, отображается информация о месяце, дне и времени. Если дата изменения была не в текущем году, отображается информация о месяце, дне и году.
Чтобы получить самый новый файл или каталог, используйте эту команду:
Чтобы получить самый старый файл или каталог, используйте эту команду:
Чтобы изменить порядок сортировки
Чтобы отменить любой из порядков сортировки, используйте параметр -r (обратный).
Список теперь упорядочен от самого маленького файла до самого большого файла.
И есть еще
Просмотрите страницу руководства по ls, есть еще много вариантов . Некоторые из них удовлетворяют несколько неясным вариантам использования, но время от времени вы будете рады, что узнали о них.
Вам нужно видеть временные метки файлов с максимальной точностью, которую может предоставить Linux? Воспользуйтесь опцией очного обучения:
Возможно, вы хотите увидеть номера inode файлов? Используйте опцию inode:
Вы работаете с монохромным дисплеем и хотите исключить риск спутать файлы с каталогами и ссылками? Используйте опцию classify, и ls добавит один из них к каждой записи списка:
/: Каталог.
@: Символическая ссылка.
|: Именованный канал.
=: Сокет.
*: Исполняемые файлыЧитайте также: