На моем компьютере с Linux я могу использовать команду file для просмотра содержимого каталога, используя его следующим образом:

file /home/user/*

Он печатает тип файла для каждого файла в каталоге /home /user /. Таким образом, я могу узнать список всех файлов в этом каталоге.

Однако на удаленной машине с Linux я не могу использовать подстановочный знак с командой file.

file /home/user/*
/home/user/*: cannot open `/home/user/*' (No such file or directory)

Не поддерживает ли команда file символы подстановки в определенных версиях Linux? Или это ограничение?

Благодарю.

1 ответ1

4

file утилита не обрабатывает подстановочные знаки, оболочка ...

Оболочка, скорее всего, bash или dash или sh , или что-то подобное - вы можете запустить echo $0 в командной строке, чтобы увидеть, что работает.


Как упоминалось выше, подстановочные знаки обрабатываются оболочкой (а не приложением), и поведение расширения по умолчанию может быть немного неожиданным. Bash, например, будет использовать следующее поведение:

  • Если /home/user либо не существует, либо в нем ничего нет, то /home/user/* не будет расширяться, но останется как есть (то есть: /home/user/*).
  • Если /home/user - это каталог с двумя файлами a и b , то /home/user/* развернется до /home/user/a /home/user/b .

С помощью bash вы можете:

  • Отключите " globbing " полностью, запустив set -f или
  • Расширьте « glob » до нуля, если он ничего не соответствует, запустив shopt -s nullglob .

Это означает, что либо:

  • Удаленная оболочка не поддерживает глобализацию
  • В удаленной оболочке по умолчанию отключено глобирование (попробуйте запустить set +f чтобы включить его)

Если ваша конечная цель действительно состоит в том, чтобы « запустить find для всех сущностей в /home/user/ », то вы можете попробовать следующее:

find /home/user/ -maxdepth 1 -type f -print0 \
    | xargs -0 file
  • -maxdepth 1 предотвращает рекурсию
  • -type f показывает только файлы (не каталоги, символические ссылки и т. д.)
  • Аргументы find 's -print0 и xargs ' -0 используются вместе, чтобы использовать символ NUL (\0) для разделения записей, поскольку в именах файлов допустимы символы новой строки (\n).
  • xargs будет использовать записи, предоставленные через stdin , и использовать их в качестве дополнительных параметров для указанной команды (в данном случае file)

По умолчанию (set +f / shopt -u nullglob)

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob x/*
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/a x/b

Без глобализации (set -f / shopt -u nullglob)

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob x/*
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/*

Расширение Null Glob (set +f / shopt -s nullglob)

$ tree
.
└── x

1 directory, 0 files
$ echo glob x/*
glob 
$ touch x/a x/b
$ tree
.
└── x
    ├── a
    └── b
$ echo glob x/*
glob x/a x/b

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .