Мені потрібно видалити всі файли в каталозі, але виключити деякі з них. Наприклад, у каталозі з файлами a b c ... z
мені потрібно видалити всі, крім u
і p
. Чи є простий спосіб це зробити?
Мені потрібно видалити всі файли в каталозі, але виключити деякі з них. Наприклад, у каталозі з файлами a b c ... z
мені потрібно видалити всі, крім u
і p
. Чи є простий спосіб це зробити?
Відповіді:
Що я роблю в цих випадках - це набрати
rm *
Потім натискаю Ctrl+ X, *щоб розгорнути *
всі видимі імена файлів.
Тоді я можу просто видалити два файли, які я хотів би зберегти зі списку, і нарешті виконати командний рядок.
*
розширюється, не стає занадто довгим. : -}
Ctrl
+ Shift
+ x
+*
Для rm
всіх, крім u,p
bash, просто введіть:
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