bash - файлы - удалить содержимое папки linux




Удалить все файлы, кроме некоторых из каталога (12)

Вместо того, чтобы переходить к прямой команде, переместите необходимые файлы в temp dir за пределами текущего каталога. Затем удалите все файлы с помощью rm * или rm -r * .

Затем переместите требуемые файлы в текущий каталог.

При использовании sudo rm -r , как я могу удалить все файлы, за исключением следующих:

textfile.txt
backup.tar.gz
script.php
database.sql
info.txt

Вы можете использовать переменную среды GLOBIGNORE в Bash.

Предположим, вы хотите удалить все файлы, кроме php и sql, тогда вы можете сделать следующее:

export GLOBIGNORE=*.php:*.sql
rm *
export GLOBIGNORE=

Таким образом, GLOBIGNORE игнорирует php и sql из подстановочных знаков, используемых как «ls *» или «rm *». Таким образом, с помощью «rm *» после установки переменной удаляется только файл txt и tar.gz.


Вы можете сделать это с помощью команды lines сначала определить массив с именем файлов, которые вы не хотите исключать

$ files=( backup.tar.gz script.php database.sql info.txt )

После этого пропустите все файлы в каталоге, который вы хотите исключить, проверяя, находится ли имя файла в массиве, который вы не хотите исключать, если он не удаляет файл.

$ for file in $(ls); do if [[ ! " ${files[@]} " ~= "$file"  ]];then rm "$file";fi;done

Это оно!


Если вы используете zsh я настоятельно рекомендую.

rm -rf ^file/folder pattern to avoid

С extended_glob

setopt extended_glob
rm -- ^*.txt
rm -- ^*.(sql|txt)

Попытка его работы с:

rm -r !(Applications|"Virtualbox VMs"|Downloads|Documents|Desktop|Public)

но имена с пробелами (как всегда) жесткие. Пробовал также с Virtualbox\ VMs вместо кавычек. Он всегда удаляет этот каталог ( Virtualbox VMs ).


Поскольку никто еще не упомянул об этом, в одном конкретном случае:

OLD_FILES=`echo *`
... create new files ...
rm -r $OLD_FILES

(или просто rm $OLD_FILES )

или

OLD_FILES=`ls *`
... create new files ...
rm -r $OLD_FILES

Возможно, вам понадобится использовать shopt -s nullglob если некоторые файлы могут быть либо там, либо нет:

SET_OLD_NULLGLOB=`shopt -p nullglob`
shopt -s nullglob
FILES=`echo *.sh *.bash`
$SET_OLD_NULLGLOB

без nullglob, echo *.sh *.bash может дать вам «a.sh b.sh * .bash».

(Сказав все это, я сам предпочитаю этот ответ , хотя он не работает в OSX)


Предполагая, что файлы с этими именами существуют в нескольких местах в дереве каталогов, и вы хотите сохранить их все:

find . -type f ! -regex ".*/\(textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt\)" -delete

Просто:

rm $(ls -I "*.txt" ) #Deletes file type except *.txt

Или:

rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes file types except *.txt & *.pdf

Это похоже на комментарий от @ siwei-shen, но вам нужен флаг -o для создания нескольких шаблонов. Флаг -o обозначает 'или'

find . -type f -not -name '*ignore1' -o -not -name '*ignore2' | xargs rm


Я предпочитаю использовать список подпрограмм:

rm -r `ls | grep -v "textfile.txt\|backup.tar.gz\|script.php\|database.sql\|info.txt"`

-v, -invert-match выбрать несогласованные строки

\| Разделитель


find [path] -type f -not -name 'textfile.txt' -not -name 'backup.tar.gz' -delete

Если вы не укажете, что -type f find также будет отображать каталоги, которые вам не нужны.

Или более общее решение, использующее очень полезную комбинацию find | xargs find | xargs :

find [path] -type f -not -name 'EXPR' -print0 | xargs -0 rm --

например, удалить все не txt-файлы в текущем каталоге:

find . -type f -not -name '*txt' -print0 | xargs -0 rm --

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


rm !(textfile.txt|backup.tar.gz|script.php|database.sql|info.txt)

Экземпляр (Extended Pattern Matching) должен быть включен в BASH (если он не включен):

shopt -s extglob






rm