Удалите все файлы/каталоги за исключением одного файла

$ awk '/^>/{f=f?0:1;}f' file

Просто включив и выключив переменную флага на encoutering строка, начинающаяся '^ '. Когда это будет идти, строки печати, еще не делайте.

262
05.09.2014, 15:17
8 ответов

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 .

310
27.01.2020, 19:26

Сохранить копию, удалить все, восстановить копию:

{   rm -rf *
    tar -x
} <<TAR
$(tar -c $one_file)
TAR

В одной строке:

{ rm -rf *; tar -x; } <<< $(tar -c $one_file)

Но для этого требуется оболочка, которая поддерживает здесь строки.

34
27.01.2020, 19:26

Другой дубль в другом направлении (если в именах файлов нет пробелов)

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)
119
27.01.2020, 19:26

В моей ОС Scientific Linux 6 это работает:

shopt -s extglob
rm !(file.txt)

У меня также установлен 32-битный Debian на виртуальной машине. Вышеупомянутое не работает, но работает следующее:

find . -type f ! -name 'file.txt' -delete
18
27.01.2020, 19:26

вы все это слишком много думаете.

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/
25
27.01.2020, 19:26

Используйте rm! ("File.txt") вместо rm! (File.txt)

12
27.01.2020, 19:26

Просто чтобы дать другой ответ, вы можете использовать поведение по умолчанию 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
8
27.01.2020, 19:26

Я считаю, что этот подход очень прост, работает и не требует никаких специальных расширений (, о которых я знаю!)

ls --hide=file.txt | xargs -d '\n' rm
7
27.01.2020, 19:26

Теги

Похожие вопросы