Удаление всех файлов и каталогов, кроме одного в Linux

Удаление всех файлов и каталогов, кроме одного в Linux

Я хочу удалить все, кроме одного файла и одного каталога из каталога, в котором я сейчас нахожусь. Как мне это сделать?

У меня есть каталог, в котором есть три каталога a, b, c и три файла 1.php, 2.php, 3.php. Я хочу удалить каталоги a и b, а также только файлы 1.php и 2.php. Я ищу решение, чтобы сделать это более простым способом. Я ищу решение, которое можно было бы использовать в большем масштабе с большим количеством папок и файлов.

решение1

find directory -not \( -name temp -o -name 3.php -o -name c -prune \) -delete

Быстрый тестовый случай показал, что это сработало, по крайней мере, в этом конкретном случае. Если есть подкаталоги с именами eg cили подобными, я думаю, вы могли бы исключить и их. Легко заставить это работать в общих случаях, но чтобы определить команду find в общем случае, требуется некоторое тестирование.

Протестируйте без оператора «-delete», чтобы увидеть, каким файлам он соответствует.

PRESSTOP: findизменяет свое поведение, когда -deleteуказано ( findпредупреждает об этом и не будет продолжать, когда -pruneуказано). Вы всегда можете перенаправить вывод в xargsи rm, или написать -execdir rm {} \;вместо -delete, хотя.

Примеры:

find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -execdir rm -r {} \;
find directory -not \( -name directory -o -name 3.php -o -name c -prune \) -print0 | xargs -0 rm -r

Это всегда сложное дело, и когда цель — удалить файлы, сделайте обширные тестовые случаи. У меня довольно много подобных finds, работающих по ночам, и я не могу сказать, что я не нервничал, освобождая их :-)

решение2

Мой инстинкт подсказывает мне: если вам нужно сохранить только один файл и одну папку, скопируйте их в безопасное место, а все остальное удалите.

cp /dir/file.txt /safe/dir/
cp -R /dir/to/save /safe/dir/
rm -rf /dir/

решение3

Попробуйте следующий скрипт на псевдо-perl:

#request the file you don't want to delete and store the name in a scalar variable.

opendir(DIRHANDLE, ".") || die "Could not open Directory handle.";
@list = readdir(DIRHANDLE);

foreach $name (@list) {
if($name != $your_input_variable) {
unlink($name);
} else {
}
}

Связанный контент