Чтобы найти файлы в домашнем каталоге (только ), которые содержат хотя бы один пробел:
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
Они расположены в алфавитном порядке. В алфавитном порядке 2
идет после 10
, потому что 2
идет после 1
, так же как B
идет после AB
. Здесь вам нужен числовой порядок вместо алфавитного порядка.
Для этого убедитесь, что вы используете оболочку zsh
(, которая должна быть пользовательской оболочкой по умолчанию в последней версии macos ), и используйте:
for d in *(N/n); do (cd -- $d && print -r -- $d && ls); done
Или в сокращенной форме:
for d (*(N/n)) (cd -- $d && print -r -- $d && ls)
Часть (N/n)
— это квалификаторы glob:
N
:заменяется ничем, если совпадений нет, вместо сообщения об ошибке(nullglob
опция включена для этого одного шара ). /
:выбирает только файлы типа директорияn
:включает числовую сортировку для расширения глобуса (numericglobsort
, включенную для этого одного глобуса ). Вы также можете включить numericglobsort
на глобальном уровне (set -o numericglobsort
), если обнаружите, что обычно предпочитаете этот порядок, и тогда вы можете вернуться к использованию своего for d in */;...
.
Обратите внимание, что *(/)
не совсем то же самое, что */
. *(/)
расширяется до всех файлов типа каталога , а */
выбирает файлы типа каталога или символической ссылки на каталог и добавляет /
, поэтому */
больше похоже на*(-/M)
(квалификатор -
glob заставляет последующие квалификаторы применять после разрешения символической ссылки, а M
должен помечать файлы типа каталога (здесь после разрешения символической ссылки )с/
).
Если вы хотите сохранить простой подход и папки, вы можете разделить их по количеству цифр:
for d in ?/; do echo "$d"; (cd "$d" && ls); done
for d in ??/; do echo "$d"; (cd "$d" && ls); done
Такое дублирование кода, конечно, не очень приятно. Но опять же, вы вообще не даете контекста, кроме «вы должны #1 #2 #3».
А может быть:
for d in {1..20}; do echo "$d"; (cd "$d" && ls); done
(также работает с косой чертой после{1..20}/
)
Это имеет смысл только в том случае, если у вас есть все номера в виде папок.
Вы можете сделать что-то вроде этого:
for d in $(find * -type d | sort -g); do echo "$d";(cd "$d" && ls);done;