2014-09-04 2 views
-1
[[email protected] dir2]# ls 
d1 d2 d3 d4 d5 f1 f2 f3 f4 f5 
[[email protected] dir2]# rm -f * 
rm: cannot remove `d1': Is a directory 
rm: cannot remove `d2': Is a directory 
rm: cannot remove `d3': Is a directory 
rm: cannot remove `d4': Is a directory 
rm: cannot remove `d5': Is a directory 
[[email protected] dir2]# ls 
d1 d2 d3 d4 d5 
[[email protected] dir2]# rm -rf * 
[[email protected] dir2]# ls 
[[email protected] dir2]# 

Я пишу инструмент для удаления файлов и каталогов. Мне нужно проверить, задал ли пользователь аргумент "*", а затем удалить все файлы и папки. Но "*", заданный в качестве аргументов, не принимает никаких файлов и папок, присутствующих в каталоге, как проверять "*" без указания внутри двойных кавычек.Как извлечь «*» без предоставления котировок при запуске исполняемого файла

./a.out * или ./a.out -f * или ./a.out -rf *. Я не могу дать ./a.out "*". Мне нужно ввести ./a.out * и выполнить проверку. Как это сделать?

+2

Расширение подстановок выполняется оболочкой, к тому времени, когда ваша программа работает, слишком поздно. Вместо этого вы можете выполнить собственное расширение '*' и посмотреть, соответствует ли оно командной строке (хотя это не является надежным, поскольку содержимое каталога может меняться промежуточный) –

ответ

0

Вы абсолютно не можете этого сделать. Причина в том, что это ваша оболочка, а не какая-либо часть вашего рабочего процесса, которая расширяет подстановочные знаки, такие как *. У вас есть несколько вариантов, хотя:

  1. сделать вашу программу принять уайлдкард в процитированном виде, например, '*' и расширять его внутри с помощью glob, fnmatch и т.д. Вы можете обнаружить, если подстановочные уже расширена за счет оболочки заметив, что появилось несколько входных аргументов, или если один из них сделал, что это существующее имя файла (* вряд ли будет существовать в реальных файлах). Это связано с тем, что вы никогда не перестанете обрабатывать очень большие расширения; сама оболочка не может передать вам больше определенного количества символов в командной строке, что иногда является ограничением в подстановочных знаках.
  2. Сделайте свою программу отказом работать с более чем N файлами одновременно. В некоторых случаях это может быть полезной защитой.
  3. Исправьте оболочку в вашей системе, чтобы сохранить текущую, нерасширенную командную строку в переменной окружения и прочитать ее из вашей программы. Это только для смелых!
Смежные вопросы