У меня есть каталог, содержащий большое количество файлов. Я хочу удалить все файлы, кроме file.txt. Как мне это сделать?
Слишком много файлов, чтобы удалить ненужные по отдельности, а их имена слишком различны, чтобы использовать *, чтобы удалить их все, кроме этого одного файла.
Кто-то предложил использовать
rm !(file.txt)
Но это не работает. Возвращает:
Badly placed ()'s
Моя ОС - Scientific Linux 6.
Есть идеи?
file-management
Kantura
источник
источник
Ответы:
POSIXly:
удалит все обычные файлы (за исключением рекурсивных, включая скрытые), кроме
file.txt
. Чтобы удалить каталоги, измените-type f
на-type d
и добавьте-r
опцию кrm
.Для
bash
использованияrm -- !(file.txt)
необходимо включить extglob :(или звонит
bash -O extglob
)Обратите внимание, что
extglob
работает только вbash
оболочке семейства Korn. И использованиеrm -- !(file.txt)
может вызватьArgument list too long
ошибку.В
zsh
, вы можете использовать^
для отмены шаблона с включенным extendedglob :или используя тот же синтаксис , с
ksh
иbash
с опциямиksh_glob
иno_bare_glob_qual
включен.источник
rm
какecho rm
вместо этого, и просить людей только вынимают эхо , когда они действительно уверены , что он будет делать то , что они хотят. Кроме этого, +1 за подробный ответ-delete
вместо-exec
, короче и проще для запоминания-delete
не определено POSIX.find
решением Gnouc вы можете сделать! \( -name one_file -o -name two_file \)
и так далее.Еще один шаг в другом направлении (если в именах файлов нет пробелов)
или (работает, даже если в именах файлов есть пробелы)
от
man grep
:источник
ls | grep -v "a file with spaces.bin" | xargs rm
. Это нормальныйgrep
синтаксис.grep
ноrm
.rm
получит список разделенных пробелами аргументов. Попробуйтеtouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: вы получитеrm: c: No such file or directory
иrm: d: No such file or directory
-print0
вfind
и-0
вxargs
. Вот обходной путь, но это немного неудобно.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
, Кстати, GNUparallel
хорошо с этим справляется (я почти всегда использую его вместо xargs:ls | grep -v 'a b' | parallel rm
-
.Сохраните копию, удалите все, восстановите копию:
В одну строку:
Но для этого требуется оболочка, которая поддерживает здесь-строки.
источник
rm
иtar -x
.rm
может потерпеть неудачу столько, сколько хочет.Вы все обдумываете это.
Готово.
РЕДАКТИРОВАТЬ На самом деле, проще:
источник
На моей научной ОС Linux 6 это работает:
У меня также установлен Debian 32bit на виртуальной машине. Выше не работает, но следующее работает:
источник
find
решение, которое я дал, не работает?file.txt
нибудь еще?»shopt
не являетсяtcsh
встроеннымИспользуйте
rm !("file.txt")
вместоrm !(file.txt)
источник
shopt -s extglob
. В любом случае, цитирование простого имени файла не имело бы значения.Просто чтобы дать другой ответ, вы можете использовать поведение по умолчанию
rm
, которое не удаляет папки:источник
Я считаю, что этот подход очень прост, работает и не требует каких-либо специальных расширений (о которых я знаю!)
источник