$ awk '/^>/{f=f?0:1;}f' file
Просто включив и выключив переменную флага на encoutering строка, начинающаяся '^ '. Когда это будет идти, строки печати, еще не делайте.
POSIXly:
find . ! -name 'file.txt' -type f -exec rm -f {} +
удалит все обычные файлы (рекурсивно, включая скрытые), кроме file.txt
. Чтобы удалить каталоги, измените -тип f
на -тип d
и добавьте параметр -r
в rm
.
В bash
, чтобы использовать rm -! (File.txt)
, вы должны включить extglob :
$ shopt -s extglob
$ rm -- !(file.txt)
(или позвонив по номеру bash -O extglob
)
Обратите внимание, что extglob
работает только в bash
и семействе командных интерпретаторов Korn. А использование rm -! (File.txt)
может вызвать ошибку Список аргументов слишком длинный
.
В zsh
вы можете использовать ^
, чтобы отрицать шаблон с включенным extendedglob :
$ setopt extendedglob
$ rm -- ^file.txt
или используя тот же синтаксис с ksh
] и bash
с включенными параметрами ksh_glob
и no_bare_glob_qual
.
Сохранить копию, удалить все, восстановить копию:
{ rm -rf *
tar -x
} <<TAR
$(tar -c $one_file)
TAR
В одной строке:
{ rm -rf *; tar -x; } <<< $(tar -c $one_file)
Но для этого требуется оболочка, которая поддерживает здесь строки.
Другой дубль в другом направлении (если в именах файлов нет пробелов)
ls | grep -v file.txt | xargs rm
или (работает, даже если в именах файлов есть пробелы)
ls | grep -v file.txt | parallel rm
от man grep
:
-v, --invert-match
Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX)
В моей ОС Scientific Linux 6 это работает:
shopt -s extglob
rm !(file.txt)
У меня также установлен 32-битный Debian на виртуальной машине. Вышеупомянутое не работает, но работает следующее:
find . -type f ! -name 'file.txt' -delete
вы все это слишком много думаете.
cd ..
mv fulldir/file.txt /tmp/
rm -rf fulldir
mkdir fulldir
mv /tmp/file.txt fulldir/
Готово.
РЕДАКТИРОВАТЬ На самом деле проще:
cd ..
ln fulldir/file.txt ./
rm -rf fulldir
mkdir -p fulldir
mv file.txt fulldir/
Просто чтобы дать другой ответ, вы можете использовать поведение по умолчанию rm
, которое не будет удалять папки:
mkdir tmp && mv file.txt tmp # create tmp dir and move files there
rm # delete all other files
mv tmp/*. && rm -rf tmp # move all files back and delete tmp dir
Я считаю, что этот подход очень прост, работает и не требует никаких специальных расширений (, о которых я знаю!)
ls --hide=file.txt | xargs -d '\n' rm