
Я хочу удалить все, кроме одного файла и одного каталога из каталога, в котором я сейчас нахожусь. Как мне это сделать?
У меня есть каталог, в котором есть три каталога 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
Это всегда сложное дело, и когда цель — удалить файлы, сделайте обширные тестовые случаи. У меня довольно много подобных find
s, работающих по ночам, и я не могу сказать, что я не нервничал, освобождая их :-)
решение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 {
}
}