Как удалить все из каталога в оболочке UNIX Кроме определенное количество файлов?
Например, как мне удалить все файлы и папки, кроме папки foo
?
Если есть также эквивалент оболочки DOS, что это такое?
Сначала проверьте:
найти путь к папке -maxdepth 1! -iname 'исключить'-and -type f -exec ls "{}" \;
Затем:
найти путь к папке -maxdepth 1! -iname 'исключить'-and -type f -exec rm "{}" \;
-maxdepth 1 означает поиск только в текущей папке (и это должен быть первый вариант)
! -iname (или -name) говорит, что не следует включать ничего, что соответствует тому, что вы хотите оставить.
-type f гарантирует, что вы не получите никаких каталогов в текущей папке.
find . -maxdepth 1 -path ./folder -prune -o -exec rm -rf '{}' ';'
Не забудьте сначала дважды проверить это с некоторыми тестовыми данными!
Чтобы соответствовать всему, кроме чего-то, обычно называют обратный матч. Для расширения имени файла используется сама оболочка. шарик. Если вы собираетесь вызывать программу вне оболочки, вы, вероятно, захотите найти, как уже упоминалось.
Вы можете выполнить обратное сопоставление с более новым bash, если включите расширенную подстановку. Например, чтобы сопоставить все, что не содержит foo или bar в имени:
shopt -s extglob
echo !(*foo*|*bar*)
Или просто все, что не имеет foo:
shopt -s extglob
echo !(*foo*)
Если в foo
, вы можете просто переместить его, удалить все остальное и переместить обратно.
Я не думаю, что в bash
'глобус, хотя вы можете создать его, используя find
регулярное выражение и iregex соответствует.
редактировать: просто мысль...
ls | grep -v ^./foo$
перечислит все файлы, кроме foo, поэтому вы можете использовать
ls | grep -v ^./foo$ | xargs rm
хотя это будет иметь проблемы, если любое из имен файлов / каталогов будет содержать пробелы.
Вы можете изменить регулярное выражение, переданное в grep, по мере необходимости, если вы хотите сопоставить шаблон, а не один файл / каталог, или пройти через grep несколько раз:
ls | grep -v ^./foo$ | grep -v ^./bar$ | xargs rm -rf
Будьте очень осторожны, чтобы проверить вывод последовательности find + grep перед добавлением xargs rm -rf
шаг.
отредактируйте снова: ls
делает то же самое, что и find . -maxdepth 1
и, наверное, проще.
Версия для Windows cmd.exe
Выведите имена всех каталогов в C: \, кроме тех, которые называются 'foo':
@echo off
FOR /D %A IN (C:\*) DO (IF /I NOT "%A"=="C:\foo" (echo %A))
Выведите имена всех файлов в C: \, кроме файлов с именем 'foo' (без учета расширений файлов):
@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~nA"=="foo" (echo %A))
Выведите имена всех файлов в C: \, кроме файлов с расширением bar:
@echo off
FOR %A IN (C:\*.*) DO (IF /I NOT "%~xA"==".bar" (echo %A))
Выведите имена всех файлов в C: \, кроме тех, которые называются 'foo.bar':
@echo off
FOR %A IN (C:\*) DO (IF /I NOT "%~nxA"=="foo.bar" (echo %A))
Измените команду 'echo' на то, что вы хотите сделать - например, 'дель'
Все вышеперечисленное нечувствительно к регистру - удалите '/ I', чтобы изменить это.
Введите "для /?" для получения дополнительных сведений о синтаксисе% ~ FOR.
Если бы это был небольшой список, я бы сделал что-то вроде:
ls -1 | egrep -v "(файл2 | файл8)" | xargs rm -rf
Которая получает список файлов, затем выполняет поиск регулярного выражения, исключая файлы, которые вы хотите сохранить, и удаляет все остальное.
Вы должны ОБЯЗАТЕЛЬНО проверить это, исключив часть xargs, чтобы убедиться, что у вас есть правильный набор файлов.
Есть и более простое решение:
Недостатком является то, что ваши драгоценные файлы мгновенно перемещаются. Это решение не подойдет, если ваши драгоценные файлы должны быть доступны все время.
Однако этот метод имеет то преимущество, что после шага 2 вы можете убедиться, что ваши драгоценные файлы в безопасности. Это особенно важно, если задействованы скрытые файлы или подкаталоги, что может повысить вероятность ошибки при использовании других методов, предлагаемых здесь.