Удаление файлов с использованием сопоставления с образцом для файлов, содержащих пробелы и звездочки

Из-за программы, которая не работала хорошо, у меня в домашнем каталоге много файлов, начинающихся с точки и содержащих странные символы, среди которых пробелы и звездочки. Я хочу удалить эти файлы, но у меня возникают проблемы при этом. Эта проблема похожа на файл Rename, содержащий пробелы и знаки препинания , но гораздо хуже. Есть слишком много файлов, чтобы удалить вручную, поэтому мне придется использовать сопоставление с образцом.

Большинство файлов начинаются с .txt} и содержат 18Jun22h (и ни один из файлов в каталоге, который я хочу сохранить, не содержит ни одну из этих строк). Как удалить все файлы, содержащие эту строку, учитывая, что файлы в каталоге, безусловно, не имеют хорошего имени Unix? Вместо этого они содержат точки, звездочки, скобки и тире. Мои первоначальные попытки провалились, вероятно, из-за присутствия этих символов в этих именах.

Любой метод, который удаляет их один за другим, был бы совершенно бесполезен для меня из-за количества файлов.


Да, я знаю, что лучше не иметь файлов, не соответствующих стандарту Unix. Это код, по которому я тоже живу. Но скрипт не работал как надо.


Во-вторых, может быть проще удалить все созданные файлы (в определенном каталоге) в определенные промежутки времени. Так что альтернативно помощь в этом ценится.


Система: Fedora 27

Я попытался ~/*18Jun22h* но подумал, что ошибка, говорящая о слишком длинном аргументе, связана с расширением * в именах файлов и выполнением чего-то странного. Вместо этого это просто потому, что существует слишком много файлов, соответствующих этому шаблону (верно?). (Я не знал, что существует максимальное количество файлов, которые может обработать rm).

Чтобы найти файлы в домашнем каталоге (только), который содержит хотя бы один пробел:

 find "$HOME" -maxdepth 1 -type f -name '*[ ]*' 

… которые содержат хотя бы один * :

 find "$HOME" -maxdepth 1 -type f -name '*[*]*' 

… которые содержат по крайней мере [ или ] :

 find "$HOME" -maxdepth 1 -type f -name '*[\[\]]*' 

… которые содержат одно из перечисленного:

 find "$HOME" -maxdepth 1 -type f -name '*[ *\[\]]*' 

Чтобы удалить эти файлы, добавьте либо -delete в конец команды, либо -exec rm {} + .


В системах, где find не поддерживает -maxdepth 1 , работает из домашнего каталога:

 find . -type d ! -name . -prune -o -type f -name '*[ *\[\]]*' -print 

Поскольку ни один из .txt} является особенным для оболочки (нет открывающей фигурной скобки), просто:

 rm ~/.txt}* ~/*18Jun22h* 

или, если их слишком много, разделите их:

 rm ~/.txt}* rm ~/*18Jun22h* 

Вы можете входить и выходить из цитат.

Например, чтобы удалить файл, начинающийся с * , затем выполните

rm "*"*

Практика с echo первым echo "*"*

Вы можете получить имена файлов для файлов, которые содержат данное выражение, с помощью grep -l , например, grep -l '18Jun22h' * . Вы можете использовать --null для передачи нулевого символа между файлами и отправки его в xargs :

 $ grep -l '18Jun22h' * --null | xargs -0 rm -- 

Я бы порекомендовал сначала сделать проверку работоспособности, как в случае демонстрации «создать, а затем удалить файлы»:

 $ for file in 'test file' 'file?name' 'file*name'; do echo foo > "$file"; done; ls -1 file*name file?name test file $ grep -l foo * --null | xargs -L1 -0 echo file*name file?name test file $ grep -l foo * --null | xargs -L1 -0 rm -- 

Способ 1: использование ./

rm -f ./'file name' и rm -f ./'file*name'

Способ 2: использование inode:

Получить инод от ls

ls -i "file name"

затем

find . -inum "numberoofinode" -exec rm {} \;