- как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- Re: как удалить файлы, кроме некоторых?
- unixforum.org
- В директории удалить все файлы кроме заданных
- В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Re: В директории удалить все файлы кроме заданных
- Использование find-удаление всех файлов / каталогов (в Linux), кроме любого
- 11 ответов
- Как удалить все, кроме 10 новейших файлов в Linux?
как удалить файлы, кроме некоторых?
Как, используя rm, удалить огромное кол-во файлов кроме каких-то нужных??
Быстренько ответели! 🙂
Re: как удалить файлы, кроме некоторых?
Открой для себя чудесный мир регулярных выражений 🙂
Re: как удалить файлы, кроме некоторых?
$ for ((i = 0; i touch $i;
> done;
$ ls -al
total 0
drwxr-xr-x 2 YurkovVV Админист 0 Jan 9 07:56 .
drwxr-xr-x 8 YurkovVV Админист 0 Jan 9 07:55 ..
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 0
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 1
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 2
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 3
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 4
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 5
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 6
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 7
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 8
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 9
$ for i in `ls —ignore=3` ; do rm -f $i;done;
$ ls -al
total 0
drwxr-xr-x 2 YurkovVV Админист 0 Jan 9 08:01 .
drwxr-xr-x 8 YurkovVV Админист 0 Jan 9 07:55 ..
-rw-r—r— 1 YurkovVV Админист 0 Jan 9 07:56 3
Re: как удалить файлы, кроме некоторых?
Во-первых, всё то, что ты понаписал, будет работать только с «хорошими» именами файлов, а во-вторых, у тебя действительно имя группы русскими буквами? Это ж ещё додуматься надо.
Re: как удалить файлы, кроме некоторых?
Под «хорошими» подразумевается regexp.
Хорош оффтопить, это же MSYS. 😉
Re: как удалить файлы, кроме некоторых?
Лучше пример своих файлов приведи, а то меня сейчас съедят некоторые!
Re: как удалить файлы, кроме некоторых?
find . -type f -not -name «asdvc» -not -name «sdfb» -print0 |xargs -0 rm
Удаляем все файлы, кроме имеющих имена «asdvc» и «sdfb». Быстро, качественно, надёжно. Гарантия полгода.
Источник
unixforum.org
Форум для пользователей UNIX-подобных систем
- Темы без ответов
- Активные темы
- Поиск
- Статус форума
В директории удалить все файлы кроме заданных
Модератор: /dev/random
В директории удалить все файлы кроме заданных
Сообщение kt315e » 20.05.2013 15:45
Re: В директории удалить все файлы кроме заданных
Сообщение IMB » 20.05.2013 15:51
Re: В директории удалить все файлы кроме заданных
Сообщение t.t » 06.09.2013 21:57
Re: В директории удалить все файлы кроме заданных
Сообщение drBatty » 06.09.2013 22:07
как-то так.
Это -delete не нужно сразу ставить, лучше сначала без него посмотреть, что получается.
PS: если есть какие-то каталоги, в которые НЕ нужно заходить вообще, используйте -prune
PS2: обход осуществляется в обратном порядке, каталоги тоже обходятся. И симлинки с хардлинками. Будьте внимательны.
PS3: ещё полезно -empty, которая даёт Ъ, если файл/каталог пуст.
Скоро придёт
Осень
Re: В директории удалить все файлы кроме заданных
Сообщение t.t » 06.09.2013 22:23
И чего здесь плохого? При выводе в пайп ls выдаст тот же результат, что и find. Разве что при именах с пробелами потребуется дополнительная обработка.
Да и лишнего написали много. Я думал, любителям sed свойственна чрезмерная лаконичность, а не наоборот. 🙂
Re: В директории удалить все файлы кроме заданных
Сообщение SLEDopit » 06.09.2013 22:28
Re: В директории удалить все файлы кроме заданных
Сообщение drBatty » 06.09.2013 22:51
а я думал, что даже фанатеги микроскопа всё равно не станут рекомендовать забивать своим тотемом гвозди. (:
На самом деле — я пробовал. Способ с ls|sed|rm тупо не нужен, ибо тупо неудобен. ИМХО.
каталог ./d1/d2/d3/d4/ тоже «в текущей директории». Разве не так?
ещё PS: для задания глубины find умеет -maxdepth и -mindepth, а ls не умеет (только -R умеет)
Скоро придёт
Осень
Re: В директории удалить все файлы кроме заданных
Сообщение t.t » 06.09.2013 23:56
Строго говоря, нет. Он в директории d1/d2/d3/
Конкретно насчет find-а согласен. Да и то только при обработке самим find-ом либо -print0 | xargs -0
А насчёт for, видимо, осталась привычка со старых версий bash, где конструкция «for f in *» и пробелы-то нормально не обрабатывала — в этом смысле надо переучиваться. (:
Re: В директории удалить все файлы кроме заданных
Сообщение drBatty » 07.09.2013 06:31
Скоро придёт
Осень
Re: В директории удалить все файлы кроме заданных
Сообщение t.t » 07.09.2013 13:44
Вы знаете людей, которые всерьез называют каталоги файлами? Я таких не встречал.
Re: В директории удалить все файлы кроме заданных
Сообщение QWERTYASDF » 07.09.2013 23:12
Я извиняюсь конечно, может чего не поняла, но зачем так сложно? Ведь оболочка распознает шаблоны.
Re: В директории удалить все файлы кроме заданных
Сообщение t.t » 07.09.2013 23:53
Re: В директории удалить все файлы кроме заданных
Сообщение Rootlexx » 08.09.2013 00:07
Re: В директории удалить все файлы кроме заданных
Сообщение drBatty » 09.09.2013 05:28
а я такого каждый день наблюдаю. В зеркале.
Да и вообще считаю, что называть каталоги файлами — это такое Дао, которое просто необходимо пройти, если не хочешь всю жизнь прозябать в криво поставленном кем-то маздае.
Как всегда, ВСЁ выше(и ниже) изложенное == МХО.
а по моему опыту сложная команда find работает быстрее, и изменять её удобнее. Даже в том случае, если её результат — список файлов, который потом как-то иначе обрабатывается.
И да, субшеллы внутрь find я-бы не рекомендовал пихать. Их можно и снаружи организовать ввиде конвейера.
В итоге, по моему опыту, если нужно выполнить сложную задачу из серии «взять файлы по сложному условию и выполнить сложное действие над ними» лучше выполнять таким кодом:
А ваш конвейер == write-only макароны, который можно написать один раз, и больше НИКОГДА не трогать. Ибо проще с нуля переписать, чем исправить.
Источник
Использование find-удаление всех файлов / каталогов (в Linux), кроме любого
Если мы хотим удалить все файлы и каталоги, которые мы используем, rm -rf * .
но что, если я хочу, чтобы все файлы и каталоги были удалены сразу, кроме одного конкретного файла?
есть ли команда для этого? rm -rf * дает легкость удаления на одном снимке, но удаляет даже мой любимый файл/каталог.
11 ответов
find может быть очень хорошим другом:
find * -maxdepth 0 : выберите все, что выбрано * без спуска в какие-либо каталоги
-name ‘b’ -prune : не беспокоить ( -prune ), что соответствует условию -name ‘b’
-o -exec rm -rf ‘<>‘ ‘;’ : call rm -rf все остальное
кстати, еще, возможно, проще, способ был бы переместить или переименовать ваш любимая каталог, чтобы он не мешал:
короткий ответ:
подробности:
мыслительный процесс для приведенной выше команды:
- Список всех файлов (ls)
- перечислить все, кроме выбранного файла (grep-v «z.txt)
- удалить перечисленные файлы (xargs rm)
создать 5 файлов, как показано ниже:
Список всех файлов, кроме z.txt
теперь мы можем удалить (rm) перечисленные файлы с помощью xargs утилиты :
вы можете ввести его в командной строке или использовать эти клавиши в скрипт
P. S. Я предлагаю -i переключатель rm чтобы предотвратить удаление важных данных.
P. P. S Вы можете написать небольшой скрипт на основе этого решения и разместить его в /usr/bin (например, /usr/bin/rmf ). Теперь вы можете использовать его как и обычное приложение:
скрипт выглядит так (просто эскиз):
по крайней мере в zsh
может быть опцией, если вы хотите сохранить только один файл.
если это только один файл, один простой способ-переместить этот файл в /tmp или что-то, rm -Rf каталог, а затем переместите его обратно. Вы можете назвать это простой командой.
другой вариант-сделать find а то grep из того, что вы не хотите (используя -v или непосредственно с помощью одного из find s предикатов), а затем rm ing остальные файлы.
для одного файла я бы сделал первое. Для чего-то большего я бы написал что-то похожее на обычай что thkala сказал.
в bash у вас есть !() оператор glob, который инвертирует согласованный шаблон. Так что удалить все, кроме файла my_file_name.txt , попробуйте это:
Я не знаю о такой программе, но я хотел ее в прошлом в течение нескольких раз. Основным синтаксисом будет:
программа, которую я имею в виду, имеет три режима:
- точное соответствие (с помощью опции -e )
- glob соответствие (по умолчанию, как показано в приведенном выше примере)
- соответствие регулярному выражению (с опцией -r )
он принимает шаблоны, которые будут исключены из командной строки, а затем разделитель — С указанием имен файлов. Кроме того, имена файлов могут быть прочитаны из stdin (если параметр -s дается), каждый по строке.
такую программу не должно быть трудно написать ни на C, ни на командном языке оболочки. И это делает хорошую тренировку для изучения основ Unix. Когда вы делаете это как программа оболочки, вы должны следить за именами файлов, содержащих пробелы и другие специальные символы, конечно.
Я вижу здесь много длинных средств, которые работают, но с a/ b/ c/ d/ e/
это удаляет все, кроме каталога b / и его содержимого (при условии, что ваш файл находится в b/. Тогда просто cd b / и
чтобы удалить все остальное, кроме файла (с именем «filename»), который вы хотите сохранить.
это выглядит нудно, но это, скорее, сейф
- избегает сложной логики
- никогда не используйте rm -rf * , ее результаты зависят от вашего текущего каталога (который может быть / 😉
- никогда не используйте globbing * : его расширение ограничено ARGV_MAX.
- позволяет проверить на ошибки после каждой команды, и, возможно, избежать катастрофы, вызванной следующей команды.
- избегает неприятных проблем причиненных космосом или НЛ в файловые имена.
Источник
Как удалить все, кроме 10 новейших файлов в Linux?
Я пытаюсь держать каталог, полный файлов журнала, управляемым. Ночью я хочу удалить все, кроме 10 самых последних. Как я могу сделать это в одной команде?
Для портативного и надежного решения, попробуйте это:
tail -n -10 Синтаксис в одном из других ответов , кажется , не работать везде (то есть, не на моих системах RHEL5).
И использование $() или « в командной строке rm рискует
- разделение имен файлов пробелами и
- превышение максимального ограничения символов командной строки.
xargs устраняет обе эти проблемы, потому что он автоматически выяснит, сколько аргументов он может передать в пределах ограничения на количество символов, и при этом -d ‘\n’ он будет разбиваться только на границе строки ввода. Технически это все еще может вызвать проблемы для имен файлов с новой строкой в них, но это гораздо реже, чем имена файлов с пробелами, и единственный способ обойти новые строки будет намного сложнее, вероятно, с использованием по крайней мере awk, если не perl.
Если у вас нет xargs (возможно, старых систем AIX?), Вы можете сделать это циклом:
Это будет немного медленнее, потому что он порождает отдельное rm для каждого файла, но все равно будет избегать предостережений 1 и 2 выше (но все еще страдает от новых строк в именах файлов).
Код, который вы хотите включить в свой скрипт
Опция -1 (числовая) печатает каждый файл в одной строке, чтобы быть в безопасности. -f Вариант rm говорит , что игнорировать файлы несуществующие для того, когда ls возвращает ничего.
Если каждый файл создается ежедневно и вы хотите сохранить файлы, созданные в течение последних 10 дней, вы можете сделать следующее:
Или, если каждый файл создан произвольно:
Такой инструмент, как logrotate, сделает это за вас. Это делает управление журналами намного проще. Вы также можете включить дополнительные процедуры очистки, такие как предложенный гало.
Теперь он работает с желаемым путем:
В Bash вы можете попробовать:
Это пропускает 10 новейших файлов, удаляет остальные. logrotate может быть лучше, я просто хочу исправить неправильные ответы, связанные с оболочкой.
Не уверен, что это кому-нибудь поможет, но чтобы избежать потенциальных проблем со странными символами, которые я использовал ls для сортировки, а затем использовать файлы inode для удаления.
Для текущего каталога это сохраняет последние 10 файлов в зависимости от времени модификации.
ls -1tri | awk ‘
Мне нужно было элегантное решение для busybox (роутера), все решения xargs или array были для меня бесполезны — такой команды там не было. find и mtime не правильный ответ, так как речь идет о 10 пунктах и не обязательно 10 днях. Ответ Эспо был самым коротким и чистым и, вероятно, самым неожиданным.
Ошибка с пробелами и когда файлы не должны быть удалены, просто решаются стандартным способом:
Немного больше образовательной версии: мы можем сделать все это, если будем использовать awk по-другому. Обычно я использую этот метод для передачи (возврата) переменных из awk в sh. Поскольку мы все время читаем, что не может быть сделано, я позволю себе не согласиться: вот метод.
Пример для файлов .tar без проблем с пробелами в имени файла. Чтобы проверить, замените «rm» на «ls».
ls -td *.tar перечисляет все файлы .tar, отсортированные по времени. Чтобы применить ко всем файлам в текущей папке, удалите часть «d * .tar»
awk ‘NR>7. пропускает первые 7 строк
print «rm \»» $0 «\»» конструирует строку: rm «имя файла»
eval выполняет это
Поскольку мы используем rm , я бы не использовал вышеуказанную команду в сценарии! Более разумное использование:
В случае использования ls -t команда не нанесет никакого вреда таким глупым примерам, как: touch ‘foo » bar’ и touch ‘hello * world’ . Не то чтобы мы когда-либо создавали файлы с такими именами в реальной жизни!
Примечание. Если бы мы хотели передать переменную sh таким образом, мы бы просто изменили вывод:
установить переменную VarName в значение $1 . Несколько переменных могут быть созданы за один раз. Это VarName становится нормальной переменной sh и впоследствии может быть использовано в скрипте или оболочке. Итак, чтобы создать переменные с помощью awk и вернуть их обратно в оболочку:
Источник