Мені потрібно видалити всі файли в каталозі, але виключити деякі з них. Наприклад, у каталозі з файлами a b c ... zмені потрібно видалити всі, крім uі p. Чи є простий спосіб це зробити?
Мені потрібно видалити всі файли в каталозі, але виключити деякі з них. Наприклад, у каталозі з файлами a b c ... zмені потрібно видалити всі, крім uі p. Чи є простий спосіб це зробити?
Відповіді:
Що я роблю в цих випадках - це набрати
rm *
Потім натискаю Ctrl+ X, *щоб розгорнути * всі видимі імена файлів.
Тоді я можу просто видалити два файли, які я хотів би зберегти зі списку, і нарешті виконати командний рядок.
*розширюється, не стає занадто довгим. : -}
Ctrl+ Shift+ x+*
Для rmвсіх, крім u,pbash, просто введіть:
rm !(u|p)
Для цього потрібно встановити наступний варіант:
shopt -s extglob
Дивіться більше: глобус - Вікі Грега
shopt -s extglob, @Ashot. Крім того, це просто файли, а не каталоги, саме тому я видалив -rfпараметри у вашій команді.
rm !(index).html. Це видалить усі файли, що закінчуються на ".html", за винятком "index.html".
Можна використовувати find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
! заперечує наступний вираз-name вказує ім'я файлу-maxdepth 1зробить процес пошуку лише вказаним каталогом ( findза замовчуванням проходить каталоги)-type f буде обробляти лише файли (а не, наприклад, каталоги)-delete видалить файлиПотім ви можете налаштувати умови, переглядаючи сторінку пошуку чоловіка
Оновлення
Спробуйте спочатку свою команду, використовуючи -printзамість-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deleteвідразу після .катастрофи (видалить усі файли в CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
findє моїм найкращим другом, особливо, коли глобусів занадто багато
Простий:
mvпотрібні файли у верхньому каталозі, rmв каталозі, а потім mvназад.
rmбез -rвидалення підкаталогів.
Дещо схожий на цю відповідь, але жодних спеціальних параметрів не потрібно, наскільки я знаю, наступним є "старовинна" функціональність, підтримувана будь-якою (смутно) / bin / sh, що нагадує оболонку (наприклад, bash, zsh, ksh тощо)
rm [^up]
rm [^up]*? Я подібні речі роблю досить часто.
Робити це без пошуку:
ls | grep -v '(u|p)' | xargs rm
(Редагувати: "u" та "v", як і в інших місцях тут, використовуються як загальні версії цілих регулярних виразів.
Ви, безумовно, захочете сценарій, якщо ви будете робити багато з цього, як запропонували інші.
-Eабоegrep
uабо ap
grep -L (u|p)' * | xargs rmде -Lзначить перелічити назви файлів, які не містять відповідності.
uабо pне будь-який файл, що містить a uчи a p. Це правильно. Ви можете виправити, скориставшисьegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Ще в епоху дискети у мене був виконаний dos під назвою "За винятком", який тимчасово переміщав би речі з поточного каталогу та виконував команду, так що ви можете сказати:
крім * .txt del *. *
щоб видалити все, крім ваших текстових файлів.
Це було б досить тривіальною річчю, яку можна реалізувати як сценарій оболонки, і якщо це буде така річ, яку ви, швидше за все, зробите більше ніж удвічі, здається, що це було б гарною ідеєю.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Це видалить усі файли, крім u і p в unix
Для тих, хто вважає за краще вказувати довільні складні виключення шаблонів (що охоплюють усі постраждалі назви файлів) у повному стилі egecs regexp, posix-awk або розширений posix (див. Сторінку пошуку man), я б рекомендував цей. Це виключає uі pв поточному режимі в цьому прикладі. Це може бути зручно для сценаріїв.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextypeпрацюватиме лише над версіями GNU
find- це розширення findкоманди GNU . Те саме стосується -regextypeопціону. Крім того, ваша команда також видалить файли в підкаталогах, тоді як в оригінальному питанні чітко задавались файли в каталозі.
Ось ще один варіант. Ви можете ввести:
rm -i *
або:
rm --interactive *
Тож rmпопросимо підтвердити видалення кожного файлу.
Використання:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
щоб видалити всі файли, включаючи каталоги, крім файлів u, p та .ext.
Простий спосіб, який важко зіпсувати: скажімо, ви хочете видалити все, крім * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp