Файловая команда не принимает символы подстановки

0

На моем компьютере с 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? Или это ограничение?

Благодарю.

Неоновая вспышка
источник
Какую оболочку вы используете на пульте? Runecho $0
Attie
Обратите внимание, что ls /home/user/файлы будут показаны в каталоге без использования подстановочного знака. Вы можете добавить -lдля получения дополнительной информации, хотя, конечно, не то, что fileпоказывает.
AFH
Это работает оболочка bash.
Неоновая вспышка
Да, я также могу использовать команду ls. Однако в этом конкретном случае мне нужно использовать команду файла.
Неоновая вспышка
1
@NeonFlash был ли мой ответ полезным?
Атти

Ответы:

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 вы можете:

  • Отключить " срывать " целиком, запустив 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Аргументы ' -print0и xargs' -0используются вместе, чтобы использовать символ NUL ( \0) для разделения записей, так как специальные символы строки newline ( \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

Нет Globbing ( 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
Attie
источник